как git svn dcommit определяет, куда делать коммит? - PullRequest
9 голосов
/ 31 августа 2010

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

$ git branch
* master
  a
  b

$ git svn dcommit -n
Committing to svn://server/repo/trunk ...

$ git checkout a
$ git svn dcommit -n
Committing to svn://server/repo/branches/a ...

$ git checkout b
$ git svn dcommit -n
Committing to svn://server/repo/branches/a ...

Таким образом, ветвь b будет фиксироваться на ветви /каталог вместо каталога branch / b.

Я пытался изменить отслеживаемую ветку:

$ git branch --set-upstream b remotes/b

И другие вещи, но единственное, что сработало, это удалитьответвление b и воссоздание его:

$ git branch -D b
$ git branch b remotes/b
$ git svn dcommit -n
Committing to svn://server/repo/branches/b ...

Теперь мой вопрос: как git svn определяет, в какой каталог сделать коммит?И как мне изменить этот каталог?

Спасибо,
Jonas

Ответы [ 2 ]

5 голосов
/ 31 января 2011

Конфигурация SVN, которую вы ищете, находится в файле .git / config вашего клонированного репозитория. Им можно манипулировать с помощью текстового редактора. Вот образец:

$ cat .git/config        
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
[svn-remote "svn"]
    url = https://pdfsam.svn.sourceforge.net/svnroot/pdfsam
    fetch = trunk:refs/remotes/trunk
    branches = branches/*:refs/remotes/*
    tags = tags/*:refs/remotes/tags/*

Предполагается, что ветви соответствуют имени-имени-имени по умолчанию. Чтобы отследить несоответствующее имя ветви, либо переименуйте локальную ветку, либо добавьте явную (удаленную) конфигурацию для ветки со странным именем:

[svn-remote "weirdbranch"]
    url = svn+ssh://ambientideas.com/svnrepos/myproject/branches/myweirdbranch
    fetch = :refs/remotes/git-svn-myweirdbranchlocalname

Кроме того, при выполнении Git-слияний ветвей из нескольких репозиториев SVN, dcommit будет (логически, но запутанно для пользователей-новичков) ориентироваться на URL-адрес SVN первого родителя фиксации слияния. В документации Git говорится, что «git svn dcommit попытается выполнить коммит поверх фиксации SVN, названной в git log --grep=^git-svn-id: --first-parent -1»

Если перебрасывать одну ветку SVN против другой, это означает, что «новейшие» коммиты (подчиненная ветвь) будут целью dcommit. Часто пользователь хочет нацелиться на доминирующее SVN-репо (филиал). Это требует, чтобы пользователь использовал опцию --no-ff при перебазировании, чтобы гарантировать, что последние коммиты указывают на доминирующую ветвь (новые вишневые коммиты).

Другие соответствующие вопросы StackOverflow включают в себя:

0 голосов
/ 28 июня 2014

Моя проблема с SVN GIT была похожа. Моя структура ветвей была иерархической:

svn/projectX/branches/
svn/projectX/branches/Android
svn/projectX/branches/Android/dev-shared

Сначала я следовал инструкциям и примерам в руководстве git-svn:

https://www.kernel.org/pub/software/scm/git/docs/git-svn.html

и клонировал мой сундук, используя:

git svn clone -s --prefix=svn/ https://mw.com/svn/projectX -T trunk -t tags -b branches/Android

Затем я проверил ветки / Android / dev-shared branch и внес изменения в мою локальную ветку git. Затем я попытался "git svn dcommit -n", чтобы посмотреть, что он будет делать без фактической фиксации.

Я видел, что он пытался зафиксировать коммиты из моей ветки в транке на svn.

ТАК рад, что я использовал опцию "-n" и избежал фиксации в неправильном месте.

После долгих исследований лучший ресурс, который я нашел, был:

http://www.janosgyerik.com/practical-tips-for-using-git-with-large-subversion-repositories/

Предложенное решение состояло в том, чтобы сначала извлечь новый клон из svn, используя:

git svn clone http://me.com/projectX/trunk projectX

и затем вручную отредактируйте файл .git \ config, чтобы добавить дополнительные записи выборки для каждой из моих веток, над которыми я хотел работать:

[svn-remote "svn"]
    url = https://me.com/svn/projectX
    fetch = trunk:refs/remotes/svn/trunk
    fetch = branches/Android/dev-shared:refs/remotes/svn/branches/Android/dev-shared

Затем, когда я повторил "git svn dcommit -n", он теперь фиксировал правильную ветку "branch / Android / dev-shared".

...