--- ОНОВЛЕННЯ 3 --- (не суперечить ОНОВЛЕННЮ 2)
Враховуючи випадок, що користувачі Windows вважають за краще працювати над, CRLF
а користувачі Linux / mac віддають перевагу роботі LF
над текстовими файлами. Надання відповіді з точки зору підтримки репозиторію :
Для мене найкраща стратегія (менше проблем вирішити) є: зберегти всі текстові файли з LF
внутрішнім мерзотником репо , навіть якщо ви працюєте над проектом , вікна-тільки. Потім надайте клієнтам свободу працювати над стилем закінчення рядків за своїм уподобанням за умови, що вони вибирають core.autocrlf
значення властивості, яке буде відповідати вашій стратегії (LF on repo) під час постановки файлів для фіксації.
Постановка - це те, що багато хто плутає, намагаючись зрозуміти, як працюють нові стратегії . Перш ніж вибрати правильне значення для core.autocrlf
властивості, важливо відмовитись від наступних пунктів :
- Додавання текстового файлу до фіксації ( постановка його) - це як копіювання файлу в інше місце всередині
.git/
підкаталогу з перетвореними закінченнями рядків (залежно від core.autocrlf
значення конфігурації вашого клієнта). Все це робиться на місцях.
- налаштування
core.autocrlf
- це як відповідь на запитання (точно таке ж питання у всіх ОС):
- "Чи повинен git-client a. Перетворювати LF-в-CRLF під час перевірки (витягування) репо-зміни змінюється з віддаленого або b. Перетворювати CRLF-в-LF при додаванні файлу для фіксації? " Та можливих відповідей (значень) є:
false:
" не робити нічого з перерахованого вище ",
input:
" робити лише б "
true
: " зробіть a і b "
- зауважте, що НІМАЄ " робити тільки "
На щастя
- налаштування клієнтських налаштувань git (windows:,
core.autocrlf: true
linux / mac:)
core.autocrlf: false
будуть сумісні зі стратегією LF-only-repo .
Значення : клієнти Windows за замовчуванням перетворюються на CRLF під час перевірки сховища та перетворюються на LF при додаванні для фіксації. А клієнти Linux за замовчуванням не здійснюють ніяких перетворень. Це теоретично зберігає лише ваш репо-ліф.
На жаль:
- Можуть бути клієнти GUI, які не поважають
core.autocrlf
значення git
- Можуть бути люди, які не використовують значення, щоб поважати вашу стратегію lf-repo. Наприклад, вони використовують
core.autocrlf=false
і додають файл із CRLF для фіксації.
Для виявлення невідкритих текстових файлів ASAP, скоєних вищевказаними клієнтами, ви можете дотримуватися того, що описано в --- оновлення 2 ---: ( git grep -I --files-with-matches --perl-regexp '\r' HEAD
, на клієнті, складеному за допомогою: --with-libpcre
flag)
А ось заковика: . Я, як репортаж репо, зберігаю git.autocrlf=input
так, щоб я міг виправити будь-які помилково виконані файли, просто додавши їх знову для фіксації. І я надаю текст фіксації: "Виправлення помилково зафіксованих файлів".
Наскільки .gitattributes
це приховано. Я на це не розраховую, тому що є більше клієнтів інтерфейсу, які цього не розуміють. Я використовую його лише, щоб надати підказки для текстових та бінарних файлів, і, можливо, позначити деякі виняткові файли, які повинні скрізь зберігати однакові закінчення рядків:
*.java text !eol # Don't do auto-detection. Treat as text (don't set any eol rule. use client's)
*.jpg -text # Don't do auto-detection. Treat as binary
*.sh text eol=lf # Don't do auto-detection. Treat as text. Checkout and add with eol=lf
*.bat text eol=crlf # Treat as text. Checkout and add with eol=crlf
Питання: Але чому нас взагалі цікавить стратегія обробки нових рядків?
Відповідь: Щоб уникнути фіксації зміни однієї літери, відображайтесь як зміна в 5000 рядків лише тому, що клієнт, який здійснив зміну, автоматично перетворив повний файл з crlf в lf (або навпаки), перш ніж додати його для фіксації. Це може бути досить болісно, коли йдеться про вирішення конфлікту . Або в деяких випадках це може бути причиною необґрунтованих конфліктів.
--- ОНОВЛЕННЯ 2 ---
Параметри git-клієнта працюватимуть у більшості випадків. Навіть якщо у вас є лише клієнти Windows, клієнти лише для Linux або обидва. Це:
- windows:
core.autocrlf=true
означає перетворити рядки в CRLF під час оформлення каси та перетворити рядки в LF при додаванні файлів.
- linux:
core.autocrlf=input
означає не конвертувати рядки під час замовлення (не потрібно, оскільки файли очікуються з LF) та перетворювати рядки в LF (якщо потрібно) при додаванні файлів. ( - update3 - : Здається, що це false
за замовчуванням, але знову це нормально)
Властивість можна встановити в різних сферах. Я б запропонував чітко встановити --global
область застосування, щоб уникнути деяких проблем IDE, описаних наприкінці.
git config core.autocrlf
git config --global core.autocrlf
git config --system core.autocrlf
git config --local core.autocrlf
git config --show-origin core.autocrlf
Також я настійно не хочу перешкоджати використанню для Windows git config --global core.autocrlf false
(якщо у вас є лише клієнти для Windows) на відміну від того, що пропонується для отримання git-документації . Якщо встановити значення false, введені файли з CRLF в репо. Але справді немає причин. Ви ніколи не знаєте, чи вам потрібно буде поділитися проектом з користувачами Linux. Плюс це один додатковий крок для кожного клієнта, який приєднується до проекту замість використання значень за замовчуванням.
Тепер для деяких особливих випадків файлів (наприклад *.bat
*.sh
), які ви хочете, щоб вони перевірялися за допомогою LF або CRLF, які ви можете використовувати.gitattributes
Підводячи підсумки для мене, найкраща практика :
- Переконайтеся, що кожен небінарний файл виконується з LF на git repo (поведінка за замовчуванням).
- Використовуйте цю команду , щоб переконатися , що файли не відбуваються з CRLF:
git grep -I --files-with-matches --perl-regexp '\r' HEAD
( Примітка: на вікнах клієнтів працює тільки через git-bash
і на Лінукс клієнтів , тільки якщо компілюється з використанням --with-libpcre
в ./configure
).
- Якщо ви знайдете будь-які такі файли, виконавши вищевказану команду, виправте їх. Це включає в себе (принаймні на Linux):
- набір
core.autocrlf=input
( --- оновлення 3 - )
- змінити файл
- відновити зміни (файл все ще відображається як змінений)
- вчинити це
- Використовуйте лише мінімальний мінімум
.gitattributes
- Попросіть користувачів встановити
core.autocrlf
описане вище за замовчуванням.
- Не розраховуйте 100% на наявність
.gitattributes
. git-клієнти IDE можуть їх ігнорувати або ставитися до них по-різному.
Як було сказано, деякі речі можна додавати в атрибути git:
# Always checkout with LF
*.sh text eol=lf
# Always checkout with CRLF
*.bat text eol=crlf
Я думаю, що деякі інші безпечні варіанти .gitattributes
замість використання автоматичного виявлення для бінарних файлів:
-text
(наприклад, для файлів *.zip
або *.jpg
файлів: не розглядатиметься як текст. Таким чином, не буде зроблено спроб безперервного перетворення. Різниця може бути можливою через програми перетворення)
text !eol
(Наприклад , для *.java
, *.html
: .. Лікували як текст, але перевагу EOL стиль не встановлено Так настройка клієнта використовується)
-text -diff -merge
(наприклад, для *.hugefile
: Не розглядається як текст. Не можливе розмежування / злиття)
--- ПОПЕРЕДНЯ ОНОВЛЕННЯ ---
Один болісний приклад клієнта, який буде фіксувати файли неправильно:
netbeans 8.2 (для Windows) буде помилково фіксувати всі текстові файли за допомогою CRLF, якщо ви явно не встановили core.autocrlf
глобальний характер . Це суперечить стандартній поведінці клієнта git і спричиняє багато проблем пізніше під час оновлення / об'єднання. Це робить те, що деякі файли виглядають різними (хоча й не є) навіть під час оновлення .
Така ж поведінка у Netbeans трапляється, навіть якщо ви правильно додали .gitattributes
свій проект.
Використання наступної команди після виконання комісії допоможе принаймні завчасно виявити, чи є у вашого git repo проблеми з закінченням рядка: git grep -I --files-with-matches --perl-regexp '\r' HEAD
Я витратив години, щоб придумати найкраще можливе використання .gitattributes
, щоб нарешті зрозуміти, що на це я не можу розраховувати.
На жаль, доки існують редактори на базі JGit (які не можуть .gitattributes
правильно впоратися ), безпечним рішенням є змусити LF скрізь навіть на рівні редактора.
Використовуйте наступні anti-CRLF
дезінфікуючі засоби.
.gitattributes
?