Подтвердить что ты не робот

Могу ли я сделать git -svn handle svn: eol-style?

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

4b9b3361

Ответ 1

Вы можете попробовать установить автопроцессы ([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

Ответ 2

ответ @silk выше - это лишь частичное решение. Полное решение также включает настройку 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 в commit, как описывает @silk, но фактически не преобразует зафиксированные файлы в конец строки LF перед фиксацией. Таким образом, любые окончания строк CRLF будут привязаны к репозиции subversion intact, но subversion ожидает, что все svn:eol-style=native атрибутные файлы будут сохранены с окончанием строки LF. Конечным результатом является то, что в первый раз, когда кто-то редактирует и записывает такой файл из рабочей копии subversion, diff будет включать преобразование CRLF в LF.

Итак, полное решение должно включать форсирование git для преобразования файлов в конец строки LF перед фиксацией. Вы можете сделать это, установив 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.

Ответ 3

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

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

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

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

    $ subgit configure svn_repos
    
  • Откорректируйте файл svn_repos/conf/subgit.conf по мере необходимости, чтобы указать расположение хранилища, расположение ветвей и тегов Git и т.д.

  • Завершите установку:

    $ subgit install svn_repos
    

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

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