Как настроить ветвь 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