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

Git клон дерева git -svn?

У меня есть рабочее дерево git -svn. Я хотел бы клонировать "чистый" git repo от этого, а затем использовать 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 рабочий процесс или я должен просто прекратить лаять это дерево?

4b9b3361

Ответ 1

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

Ответ 2

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

Мой односторонний сценарий: существующий репозиторий git в github, нужно только для чтения svn зеркало git master branch

  • Создайте и инициализируйте целевой репозиторий subversion на сервере:

    svnadmin create svnrepo
    mkdir trunk
    svn import trunk svn://yoursvnserver/svnrepo
    rmdir -rf trunk
    
  • Создайте смешанный git -Svn checkout и инициализируйте репозиторий 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 также могут помочь:

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

Если вы можете установить пользовательские перехватчики в репозиторий 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.

Ответ 6

Используя 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 repo:

git checkout master
git svn dcommit

выполнит все git фиксации, которые были нажаты.