Git: Удаление возврата каретки из файлов, контролируемых источником - PullRequest
15 голосов
/ 18 марта 2010

У меня есть Git-репозиторий, в котором есть несколько файлов в формате DOS (\r\n окончания строк). Я хотел бы просто запустить файлы через dos2unix (что приведет к изменению всех файлов в формат UNIX с \n окончаниями строк), но насколько сильно это повлияет на историю, и рекомендуется ли это вообще?

Я полагаю, что стандарт заключается в том, чтобы всегда использовать окончания строк UNIX для файлов, контролируемых источником, и при необходимости переключаться на локальные окончания строк, специфичные для ОС?

Ответы [ 4 ]

24 голосов
/ 26 октября 2010

Эта штука привела нас в бешенство, когда мы перешли из svn в git (в центральной (голой) среде scm. В конечном итоге мы получили то, что мы скопировали глобальный файл .gitconfig в корень каждого пользователя (да, и для windows, и для linux), причем исходный файл исходил из системы Windows и имел core.autocrlf = true и core.safecrlf = false, что вызвало хаос на пользователях Linux (например, скрипты bash не работали и все эти ужасные ^ M). Итак, изначально мы сделали скрипт checkout и clone, который выполнял dos2unix после этих команд. Затем я перешел к элементам конфигурации core.autocrlf и core.safecrlf и установил их на основе O / S:

Windows: core.autocrlf = true и core.safecrlf = false Linux: core.autocrlf = input и core.safecrlf = false

Они были установлены с: --- на Windows ---

git config --global core.autocrlf true
git config --global core.safecrlf false

--- в Linux ---

git config --global core.autocrlf input
git config --global core.safecrlf false

Затем для наших разработчиков Linux мы установили небольшой скрипт bash / usr / local / bin / gitfixcrlf:

#!/bin/sh
# remove local tree
git ls-files -z | xargs -0 rm
# checkout with proper crlf
git checkout .

Который им приходилось запускать только на локальных клонах с песочницей один раз Любое будущее клонирование было сделано правильно. Любые будущие толчки теперь обрабатывались правильно. Таким образом, это решило наши проблемы с O / S при помощи перевода строки. Также обратите внимание, что Mac находится в той же конфигурации, что и Linux.

10 голосов
/ 18 марта 2010

Подход, который вам придется использовать, зависит от того, насколько публичен ваш репозиторий.

Если вы не возражаете или не заботитесь об изменении всех SHA, потому что вы более или менее единственный, кто его использует, но хотите, чтобы эта проблема разобралась на все времена, вы можете запустить git filter-branch и применить dos2unix ко всем файлам в каждом коммите. (Если вы используете хранилище совместно, всем остальным нужно более или менее полностью обновить его, так что это потенциально опасно.)

Так что лучшим вариантом, а также более простым способом было бы изменить его только в текущих заголовках. Это означает, что ваши прошлые коммиты по-прежнему имеют \r\n концовок, но если вы не делаете большой выбор вишни из прошлого, это не должно быть проблемой. Разумеется, инструменты сравнения могут жаловаться немного чаще, но обычно вы будете сравнивать только с коммитами, находящимися поблизости, поэтому эта проблема разрешается сама собой по мере накопления коммитов.

И окончания строк UNIX стандартны, вы правы в этом. Лучший подход - настроить редактор так, чтобы он писал только эти окончания даже на окнах. В противном случае вы также можете использовать настройку autocrlf.


Дополнение к части переписывания истории:

В прошлый раз, когда я делал то же самое, я использовал следующую команду, чтобы изменить все файлы на окончание Unix.

#!/bin/bash
all2dos() { find * -exec dos2unix {} \; }
export -f all2dos
git filter-branch -f --tree-filter 'all2dos' --tag-name-filter cat --prune-empty -- --all
4 голосов
/ 18 марта 2010

Для продолжения решения взгляните на core.autocrlf (и core.safecrlf) параметры конфигурации .

Выполнение этого один раз для всего вашего репозитория просто создаст один коммит, с которым практически невозможно слить (так как каждая строка в этих файлах будет изменена), но как только вы пройдете его, это не должно быть большой проблемой. (Да, вы можете использовать git filter-branch для внесения изменений в историю, но это немного страшно.)

0 голосов
/ 17 мая 2017

Если ваш список файлов с управлением версиями содержит двоичные файлы, или вы не можете легко изменить историю ... вот удобная однострочная строка:

https://unix.stackexchange.com/a/365679/112190

...