2015-11-22 4 views
3

Я бы хотел, чтобы git сохранял текстовые файлы с внутренним концом CLRF, я не просто хочу видеть такие окончания строк в рабочем каталоге (но WD должен также содержать файлы CRLF). Какова конфигурация .gitattributes, которая бы достигла этого?Сделать git хранить текстовые файлы с концами строк CRLF с .gitattributes

Мне нужно это, чтобы хранилище можно было легко синхронизировать с Mercurial, в котором также используется CRLF (из-за того, что исходные файлы были такими).

После перебора любой возможной конфигурации, которую я нашел в Интернете, в том числе здесь, я не мог найти решение, которое даст CRLF. В конечном итоге файлы хранятся как LF. Я попробовал следующий .gitattributes файл:

* text= 
* text eol=crlf 

Также попробовал текст = автоматический, текст = CRLF и даже без первой линии, не повезло. Я также повторно клонирую репо между изменением этого.

спасибо.

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

*.* -crlf 

Однако я не уверен, что именно это делает. Может кто-нибудь подтвердить, пожалуйста, что это то, что я хочу, это не укусит меня позже?

ответ

4

Вы хотите противоположность тому, что Git поддерживает изначально. Git считает, что линия перевода является внутренней внутренней строкой, и либо поддерживает фильтрацию без фильтрации, поэтому lf или crlf хранятся в зависимости от того, что есть в файлах в файловой системе, или фильтрации для преобразования crlf в файлы в файловой системе в lf внутренне и внутренне для crlf в файловой системе. Таким образом, ни одна из настроек eol не будет работать для вас, поскольку это звучит так, как будто вы хотите наоборот; crlf внутри, а lf - в файловой системе.

Git также поддерживает произвольные «пятна» и «чистые» фильтры. «smudge» выполняет некоторую трансформацию, которая «искажает» файл, а «clean» должна делать противоположное преобразование, чтобы очистить его до фиксации.

Чтобы сделать это, добавьте следующие строки в .git/config:

[filter "dosify"] 
     clean = unix2dos 
     smudge = dos2unix 

И тогда в вашем .gitattributes:

* filter=dosify 

Если у вас нет dos2unix/unix2dos установлен, вы можете использовать вместо :

[filter "dosify"] 
     clean = tr '\\n' '\\r\\n' 
     smudge = tr '\\r\\n' '\\n' 

Редактировать: Чтобы ответить на ваши изменения, -crlf просто означает, что нет crlf < -> lf переводы будут выполняться в любом направлении. Он не будет переводить lf в ваш рабочий каталог на crlf внутри, поэтому, если у вас есть редакторы, которые хранят lf, но для этого необходимы данные crlf, это не поможет. Если вы просто хотите избежать какого-либо перевода, то нужно просто * -crlf, чтобы избежать автоматического перевода. Однако, если вы не выполняете никакого перевода, это значение по умолчанию, если вы никогда не устанавливали никаких параметров, таких как autocrlf (кроме Windows, где я считаю, что autocrlf по умолчанию).

+0

Благодарим вас за подробный ответ.Как уже упоминалось, я хотел бы также увидеть CRLF (или родную систему) в WD, но хранить CRLF в любом случае. Но то, что вы описали, также охватывает это. Я не сказал этого, но в идеале этот конфиг - это что-то, что будет путешествовать с репо. Правильно ли я понимаю, что то, что вы предлагаете, не является тем, что можно полностью настроить из .gitattributes (вторая версия)? И да, на Windows git будет преобразовываться в LF внутри, так как autocrlf по умолчанию является истинным. – Piedone

+0

@Piedone Да, это правильно; вы должны настроить свой '.git/config', чтобы определить фильтр, и который не получает толкаемый или вытащенный с репо, вам нужно настроить его в каждом репо, с которым вы хотите его использовать. –

+0

Благодарим вас за объяснение. – Piedone