Учитывает ли git мои .gitattributes для * .vbs text eol = crlf? - PullRequest
0 голосов
/ 09 июля 2019

В настоящее время я работаю с файлами VBScript (* .vbs), предназначенными для работы только в Windows.

Я хочу, чтобы они проверялись с помощью CRLF независимо от того, как разработчики установили свои core.autocrlf. Кстати, мой, кажется, установлен на false при запуске git config --get core.autocrlf

Итак, я создал .gitattributes файл с этим:

*.vbs text eol=crlf

Записал оба файла (с их CRLF EOL) и этот .gitattributes один.

Но теперь я сделал некоторые изменения в файле, не изменяя EOL, когда я хочу увидеть разницу, например. в gitk я должен проверить Игнорировать изменение пробела , чтобы правильно увидеть различия строк, в противном случае считается, что весь файл изменился.

Что я сделал не так?

Примечание: особенно здесь, на SO и других форумах, я читаю людей, которые говорят использовать, например. *.vbs binary чтобы Git не мог изменять EOL - так же, как это рекомендуется делать для *.jpg файлов в онлайн-документе Git - однако binary означает -text -diff, и я не хочу (не) устанавливать -diff потому что я хочу получить различий !!

1 Ответ

1 голос
/ 09 июля 2019

Если вы говорите Git не копаться в ваших файлах, вы должны учитывать тот факт, что некоторые файлы постоянно хранятся с окончаниями строк только для LF, а другие - с окончаниями строк CRLF.

Если вы скажете Git связываться с вашими файлами, это будет сделано не только при извлечении (git checkout) или добавлении (git add) файлов, которые должны быть сохранены в постоянном формате, но также и при извлечении файлов для различий.

Это часть того, что вы должны выбрать сейчас, потому что ясно, что у вас есть готовые копии, имеющие LF-ony окончания строки.

Как это все работает

Объявление:

<pattern> text eol=crlf

, по сути, является командой для Git, которая сообщает:

  • Когда вы берете файл out сублимированного формата (как хранится в хранилище и в области index / staging, чтобы поместить его в рабочее дерево, где вы можете его увидеть и использовать), измените любой конец строки только для новой строки.строки в конец строки CRLF.

  • Когда вы замораживаете файл, т. Е. Сохраняете файл рабочего дерева в индексе, чтобы он перешел в следующего коммита и имел окончания строки CRLF, замените их на конец строки только для новой строки.

Другими словами, вы говорите Git: Пожалуйста, покопайтесь в моих файлах. The eol=...Часть говорит, как гадить с файлами.Часть строки pattern сообщает Git , какие файлы, а директива text сообщает Git: Это текстовые файлы, поэтому они отображаются нормально на моем экране.в diff, и вы должны связываться с ними.

Если вы используете binary в качестве атрибута, вы говорите Git: Это двоичные файлы, поэтому они не отображаютсяОК на моем экране в diffs, и вы вообще не должны связываться с ними.

Как отметил phd в комментарии , вы можете использовать -text, чтобы сказать не связывайтесь с ними без и , говоря , они не могут быть отображены .Но высказывание не связывайтесь с ними означает не связывайтесь с ними , и это включает в себя извлечение обезвоженного содержимого для создания различий.

Все из-за того, что Git работает с файлами, происходит либо на этапе регидратации, когда лиофилизированный файл превращается в пригодный для использования, либо на этапе лиофилизации, когда обычный файл превращается в файл, который можно хранить внутри Git,Более того, все встроенных в Git процессов модификации текстовых файлов хранят их внутри Git с LF-концами строк.Если эти *.vbs файлы должны иметь CRLF внутри них при хранении в Git, 1 они не должны изменяться при входе, и поэтому вы не можете использовать встроенные в Git файлы.опции модификации.

Если файлы могут (разрешены) иметь LF-окончания строк, сохраненные в Git, вы можете использовать встроенные модификации.Если они должны иметь окончания строк CRLF в вашем рабочем дереве (или в любой форме, в которой вы можете видеть и работать с ними), и существующих подтвержденных копий, хранящихся в Git, уже имеют LF- только в конце строки, тогда вы должны выбрать, чтобы Git вносил изменения в файлы при их входе и выходе из форматов сублимационной сушки, поскольку ни один существующий файл с фиксированной сублимацией, сохраненный в Git, теперь не может бытьизменено. 2

Если вы можете жить с существующими сублимированными копиями, которые не имеют окончания строк CRLF, оставаясь такими, когда они возвращаются, в то время какновые файлы хранятся в Git с их окончаниями строк CRLF и сохраняют их окончания строк CRLF при копировании и вводе, вы можете использовать -text (или вообще ничего не использовать 3 ) и просто не иметь Git messс ними.


1 Мне не ясно, зачем это вообще понадобится, поскольку только Git может читать сублимированные сохраненные файлы Git. Я говорю об этом так, потому что так легче думать об этом, и , а затем переходят от «это обязательно должно быть сделано таким образом» к «я бы предпочел сделать это так», когда вы ослабите свои ограничения .

2 У вас, конечно, есть возможность взять какой-нибудь существующий репозиторий и преобразовать его в новый и другой репозиторий с новыми и разными коммитами, которые имеют файлы в какой-то другой форме. Вы можете сделать это по всему хранилищу, используя git filter-branch ... --all или некоторое подмножество хранилища. Преимущество этого состоит в том, что вы получаете «чистый» репозиторий, как если бы вы давно следовали любой практике, которую вы сейчас установили. Недостатком является то, что вы должны заставить всех, у кого есть клон исходного репозитория, перейти на использование коммитов замены, которые вы придумали сегодня.

3 Первоначальная концепция Git заключалась в том, что он должен был сохранять все файлы в точности так, как они появлялись в индексе во время фиксации. Эта концепция остается, но введение этих модификаций - «размазывания» файлов по мере их выхода из индекса в рабочее дерево, а затем «очистки» их при возвращении к следующему коммиту - позволяет пользователям Windows, которые требуют Концы строк CRLF, чтобы ладить с пользователями Linux, которые требуют окончания строк только для LF. Но он также вводит эту неуклюжую ситуацию, в которой Git теперь должен знать, какие файлы должны запутаться - какие из них «текстовые», а какие нет, потому что они «двоичные». Устраните проблемы с вашими данными, и вы избавитесь от необходимости описывать, какие файлы получают какую обработку.

...