Могу ли я сделать git-svn handle svn: eol-style? - PullRequest
18 голосов
/ 24 января 2010

Многие svn-репозитории требуют, чтобы новые файлы имели атрибут svn: eol-style. Есть ли способ убедиться, что это происходит с git-svn?

Ответы [ 3 ]

12 голосов
/ 25 января 2010

Вы можете попробовать установить авто свойства ([ 1 ] [ 2 ]) в конфигурации Subversion. Это гарантирует, что во время операции добавления новых файлов svn: eol-style будет установлен правильно.

AFAIU git-svn просто использует svn во внутренних процессах, и он должен загрузить конфигурацию Subversion и установить авто-реквизит для новых файлов.

Хорошо, я проверил, все работает.

Пример. Subversion / config:

[miscellany]
enable-auto-props = yes

[auto-props]
*.cpp = svn:keywords=Id Revision;svn:eol-style=native
*.cs = svn:keywords=Id Revision;svn:eol-style=native
8 голосов
/ 26 мая 2012

@ ответ шелка выше является лишь частичным решением. Полное решение также включает в себя настройку git для преобразования CRLF в LF при коммите. Итак, в дополнение к тому, что предлагает @silk, вы должны также сделать:

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

Или:

git config --global core.safecrlf warn
git config --global core.attributesfile ~/.gitattributes
echo '* text=auto' >> ~/.gitattributes

Пояснение:

По моему опыту, git-svn установит атрибут svn:eol-style=native при фиксации, как описывает @silk, но не фактически преобразует зафиксированные файлы в окончания строк LF перед фиксацией. Таким образом, любые окончания строк CRLF будут зафиксированы в неповрежденном хранилище Subversion, но Subversion ожидает, что все приписанные svn:eol-style=native файлы будут сохранены с окончаниями строк LF. Конечным результатом является то, что в первый раз, когда кто-то редактирует и фиксирует такой файл из рабочей копии Subversion, diff будет включать преобразование CRLF в LF.

Итак, полное решение должно включать принудительное преобразование файлов в конец строки LF перед выполнением команды git. Вы можете сделать это, установив core.autocrlf=input, что означает «преобразовать все CRLF в LF при фиксации, но не выполнять обратное преобразование при извлечении», и core.safecrlf=warn или core.safecrlf=true, которые будут предупреждать или останавливать вас, когда вы попробуйте зафиксировать файл с окончанием строки CRLF. Параметр autocrlf обеспечит преобразование этих CRLF, поэтому safecrlf=true, вероятно, является чрезмерным. См git help config.

Кроме того, вы можете использовать атрибуты git для принудительного преобразования, установив text=auto для всех файлов. Чтобы сделать это глобально, вам нужно указать файл атрибутов в core.attributesfile. См git help attributes.

2 голосов
/ 19 июня 2012

Рассмотрите возможность использования SubGit .

С самых первых сборок он поддерживает правильные свойства Subversion для преобразования .gitattributes / .gitignore (и наоборот). Среди прочего, в том числе svn: eol-style и 'eol', svn: mime-type и 'text', svn: ignore и .gitignore.

SubGit - это решение на стороне сервера - его необходимо установить в хранилище Subversion. После этого можно использовать любой клиент Subversion или Git для отправки изменений в этот репозиторий. Пожалуйста, обратитесь к Документация SubGit , чтобы получить более подробную информацию. В общем, его довольно просто использовать:

  1. Создание файла конфигурации SubGit:

    $ subgit configure svn_repos
    
  2. Настройте файл svn_repos / conf / subgit.conf, чтобы указать местоположение репозитория Git, расположение веток и тегов и т. Д.

  3. Завершить установку:

    $ subgit install svn_repos
    

В этот момент SubGit преобразует все ревизии из вашего хранилища Subversion в хранилище Git. Затем он устанавливает свои пользовательские хуки, которые будут вызваны входящими изменениями. Таким образом, SubGit непрерывно конвертирует ревизии Subversion при каждом svn коммите, а Git фиксирует при каждом git push.

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

...