Как настроить ветвь upstream в git -svn?
При работе в обычном репозитории git локальная ветвь обычно отслеживает соответствующую удаленную ветвь вверх по течению. Таким образом, я могу легко видеть, буду ли я впереди или позади моей ветки вверх по течению, и поэтому, если мне нужно нажать или потянуть, чтобы привести их в синхронизацию. Также мое приглашение сразу показывает это состояние, что очень удобно.
Теперь я работаю над репозиторием SVN с помощью git-svn
. Я использовал --prefix=svn
для клона, поэтому git branch -r
перечисляет svn/trunk
как удаленную ветвь, но (хотя git svn rebase
работает без проблем) он не настроен как ветвь восходящего потока для моей главной ветки.
Я попытался установить информацию отслеживания вручную, но это не удалось:
$ git branch -r
svn/trunk
$ git branch --set-upstream-to=svn/trunk
fatal: Cannot setup tracking information; starting point 'svn/trunk' is not a branch.
Есть ли способ отслеживать ветвь svn upstream?
Есть ли еще какой-нибудь другой способ узнать, буду ли я впереди или позади этой ветки? (Глядя на gitk --all
, в настоящее время это единственный способ, о котором я знаю.)
Есть ли какой-нибудь способ сделать мое приглашение (bash __git_ps1
) показать эту информацию?
$ git --version
git version 1.9.0.msysgit.0
Ответы
Ответ 1
Кажется, это ошибка, введенная в git 1.9, так как --set-upstream-to
работал до того, как вы упоминаете.
И strace
отображает правильную локализацию и чтение восходящей ветки ref, однако, по какой-то причине она игнорируется.
Моим обходным решением для этой проблемы является ручное редактирование .git/config
:
$ cat >> .git/config << EOF
[branch "master"]
remote = .
merge = refs/svn/trunk
rebase = true
EOF
- который должен быть эквивалентен:
git branch --set-upstream-to=svn/trunk master
& & git config branch.master.rebase true
(который вы хотите с svn в любом случае)
- но нет, из-за ошибки! "Конечно, мой refs/svn/trunk
- это ветка!" вы говорите, и отредактируйте конфигурацию напрямую (с немного меньшей силой).
Ваша svn-строка может быть названа по-разному в git в зависимости от того, как вы клонировали параметры репо (-s
, -T
, --prefix
до git svn clone
). Просто выполните git branch -avv
и найдите правильный. Например, одним из возможных имен является refs/remotes/git-svn
; или refs/svn/trunk
, как указано выше; или даже что-то еще.
Обновление Nov 2015
Я все еще воспроизвожу это на git version 2.1.4
. Кто-нибудь беспокоит файл отчета об ошибке?
Ответ 2
git-svn
сохранит данные конфигурации в .git/config
, например, в одном из моих репо config выглядит следующим образом:
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[svn-remote "svn"]
url = http://svn.repo.com/repos/myrepo
fetch = trunk:refs/remotes/trunk
branches = branches/*:refs/remotes/*
tags = tags/*:refs/remotes/tags/*
В разделе [svn-remote "svn"]
вы можете увидеть все конфигурации git-svn
. В разделе branches
вы увидите все ветки на удаленном ретрансляторе svn
.
Когда мне нужно следовать ветке svn
в моем локальном репо git
, я обычно делаю следующие шаги:
- Я проверяю, что
config
правильно настроен со всеми branches
и tags
.
- Я делаю
git svn fetch
, таким образом git будет извлекать все данные в репо для всех ветвей
-
Я проверяю, что все branches
/tags
присутствуют в качестве вывода git branch -a
, например:
master
prod
scenarioParametro
remotes/tags/alpha-1
remotes/trunk
-
Я создаю локальный git branch
для отслеживания удаленного с помощью
git branch alpha-1 remotes/tags/alpha-1 --track
Таким образом, вновь созданная ветвь alpha-1
будет следовать за remotes/tags/alpha-1
, и вы можете выполнять команды rebase
и dcommit
.
Ответ 3
Это все еще проблема для меня, используя git 1.9.5.
И я не получил ни одного из упомянутых здесь решений, но это сработало:
git rebase origin/remote-branch-name
После этого git svn dcommit -n
показывает, что он действительно передаст эту ветвь svn.
Обновление. У меня была такая же проблема снова, и на этот раз вышеуказанное не сработало. Я получил сообщение: Current branch master is up to date.
Однако используя:
git rebase -i origin/remote-branch-name
в любом случае принудительно перебалансировало, и после этого восходящий поток был настроен правильно.
Ответ 4
Так как никто не ответил на это:
Есть ли какой-то другой простой способ узнать, я впереди или позади этой ветки?
Да, это. Вы можете просто использовать общее понятие, которое GIT использует для сравнения ссылок и в этом случае. Это ref_from..ref_to
Например:
git log master..svn/trunk
- даст вам все коммиты из svn/trunk
, которые отсутствуют в вашем master
. То есть входящие изменения.
git log svn/trunk..master
- даст вам все коммиты из master
, которые отсутствуют в svn/trunk
. То есть исходящие изменения.
Дополнительное объяснение общего синтаксиса: здесь на SO и в официальной документации GIT