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