Как сохранить окончания строк, когда я извлекаю один файл в другое место с помощью 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-строчный сценарий оболочки, который извлекает данные из временного каталога, а затем перемещает извлеченный файл.

Другие вопросы по тегам