мерзавец-клон мерзавца-дерева? - PullRequest
16 голосов
/ 20 февраля 2009

У меня есть рабочее дерево 'git-svn'. Я бы хотел клонировать «чистый» репозиторий git, а затем использовать git push / pull для перемещения изменений между деревом git-svn и деревом git, а также использовать «git svn dcommit / rebase» для перемещения изменений между дерево git-svn и репозиторий SVN, на котором оно основано.

Кажется, это работает нормально, если перемещать вещи между деревьями git с помощью методов git, но как только я взаимодействую с репозиторием SVN в дереве git-svn, все становится чище - либо я получаю ошибки когда я толкаю или тяну между деревьями git, или я теряю коммиты в дереве git-svn, или другие странности.

Этот тип рабочего процесса SVN <-> git-svn <-> git вообще поддерживается или я должен просто прекратить лаять это дерево?

Ответы [ 6 ]

9 голосов
/ 16 февраля 2010

Одна вещь, которая может вызывать у вас проблемы, - это то, что git svn dcommit перепишет все коммиты, которые он отправляет в SVN, по крайней мере, если он настроен на добавление примечания метаданных SVN в конец сообщений фиксации. Таким образом, вам придется принять поток, в котором любые репозитории, принимающие коммиты из вашей рабочей области git-svn, перезагружают его, теряя всю историю слияний, которая все равно не может быть сохранена в SVN.

9 голосов
/ 20 февраля 2009

У меня есть настройка моста для некоторых моих проектов, но он только односторонний от git до svn (предоставляя общедоступное зеркало SVN только для чтения нашей ветки git master). Однако, так как он работает нормально, он может помочь вам или направить вас в правильном направлении в вашем двустороннем сценарии, так как я предполагаю, что это git-> svn создает проблемы, а не svn-> git:

Мой односторонний сценарий: для существующего git-репозитория на github необходимо только svn-зеркало для чтения ветки git master

  • Создание и инициализация целевого хранилища Subversion на сервере:

    svnadmin create svnrepo
    mkdir trunk
    svn import trunk svn://yoursvnserver/svnrepo
    rmdir -rf trunk
    
  • Создание смешанной проверки Git-Svn и инициализация хранилища Subversion

    git svn clone svn://yoursvnserver/svnrepo/trunk
    cd trunk
    git remote add github git://github.com/yourname/repo.git
    git fetch github
    git branch tmp $(cat .git/refs/remotes/github/master)
    git tag -a -m "Last fetch" last tmp
    INIT_COMMIT=$(git log tmp --pretty=format:%H | tail -1)
    git checkout $INIT_COMMIT .
    git commit -C $INIT_COMMIT
    git rebase master tmp
    git branch -M tmp master
    git svn dcommit --rmdir --find-copies-harder
    
  • Обновление зеркала

    git fetch github
    git branch tmp $(cat .git/refs/remotes/github/master)
    git tag -a -m "Last fetch" newlast tmp
    git rebase --onto master last tmp
    git branch -M tmp master
    git svn dcommit --rmdir --find-copies-harder
    mv .git/refs/tags/newlast .git/refs/tags/last
    

Также могут помочь две статьи из googlecode:

5 голосов
/ 16 февраля 2010

Исходя из того, что я видел, этот рабочий процесс не поддерживается в git-svn и не будет из-за того, как SVN представляет слияния.

3 голосов
/ 16 февраля 2010

Как я часто говорил на #git:

git-svn похож на летающий автомобиль. Все хотят летающий автомобиль, пока не поймут, что летающий автомобиль довольно плох, как машина или самолет.

Реальное решение - полностью уйти от SVN как можно быстрее. Используйте git-svn для одноразовой миграции, затем переместите всех. Git - не , который трудно выучить.

2 голосов
/ 16 июля 2012

Если вы можете установить собственные хуки в хранилище Subversion, рассмотрите возможность использования SubGit .

SubGit - это решение на стороне сервера, которое автоматически синхронизирует SVN и Git-репозитории. Чтобы установить SubGit, выполните следующие действия:

    $ subgit configure $SVN_REPOS
    $ # Adjust $SVN_REPOS/conf/subgit.conf 
    $ #     to specify your branches and tags
    $ # Adjust $SVN_REPOS/conf/authors.txt 
    $ #     to introduce svn author names to their git counterparts
    $ subgit install $SVN_REPOS
    $ ...
    $ INSTALLATION SUCCESSFUL

На данный момент SubGit установил хуки, которые запускаются каждым svn commit и git push. Таким образом, SubGit преобразует любую входящую модификацию.

См. Также сравнение с git-svn .

1 голос
/ 20 августа 2011

При использовании git и git-svn 1.7.1 кажется, что тест, который я только что сделал, работает нормально.

git svn init [url]
git svn fetch

Затем вы должны создать и оформить фиктивную ветвь, чтобы иметь возможность перейти в основную ветвь.

git checkout -b dummy

Затем вы можете клонировать его (git clone ...) в другое чистое репозиторий git, изменить его, зафиксировать (git commit), а затем вставить (git push) в репозиторий git-svn.

вернуться к репозиторию git svn:

git checkout master
git svn dcommit

передаст все git-коммиты, которые были переданы.

...