Как сохранить окончания строк, когда я извлекаю один файл в другое место с помощью git?
Я хочу извлечь один файл из репозитория git в другое место (кроме рабочего каталога) и оставить текущий рабочий каталог таким, какой он есть. И я хочу, чтобы git проверил мой файл с правильными окончаниями строк.
Я работаю в Windows, но у меня такая же проблема и в Linux.
Вот мой сценарий (Win7 64-разрядная версия):
Сначала я проверяю, что git преобразует CRLF в LF при фиксации и LF в CRLF при извлечении:
git config --local core.autocrlf true
Затем я создаю файл с именем crlf.txt с окончанием строки CRLF и фиксирую его:
git add crlf.txt
git commit -m "File with crlf"
Я изменяю что-то в crlf.txt и фиксирую это:
git add crlf.txt
git commit -m "Change in crlf.txt"
Теперь я хочу получить crlf.txt, как это было при первом коммите:
git show HEAD~1:crlf.txt > "/home/user/crlf_like_in_head-1.txt"
Файл "crlf_like_in_head-1.txt" не содержит CRLF, но LF. Я думаю, что git show является правильным, потому что он показывает содержимое файла, как в хранилище (core.autocrlf=true преобразует CRLF в LF). Я знаю это из документации, и я попробовал то же самое с core.autocrlf=false. С core.autocrlf=false "crlf_like_in_head-1.txt" содержит CRLF. Я знаю, что могу легко конвертировать LF в CRLF, но я должен убедиться, что файл результатов такой же, как он был проверен с помощью git.
Я знаю, что я также могу оформить один файл с помощью git checkout:
git checkout HEAD~1 crlf.txt
Но он перезаписывает текущее содержимое crlf.txt в рабочем каталоге (также, если crlf.txt был в грязном состоянии), и я не могу извлечь его в другую папку с помощью git checkout.
1 ответ
Вы получили это право - git show
просто показывает вам, что находится в репо - магия кассы не происходит.
Вы можете достичь желаемого, временно изменив местоположение вашего рабочего каталога для оформления заказа.
git --work-tree=/home/user checkout HEAD~1 crlf.txt
Это проверит файл на /home/user/crlf.txt
, Примечание. Если вы извлекаете файл в подкаталоге, этот каталог также будет создан в целевой папке. Вы не можете ни предотвратить это, ни указать имя файла целевого файла. Если это проблема, вы должны написать 2-строчный сценарий оболочки, который извлекает данные из временного каталога, а затем перемещает извлеченный файл.