Добавьте ветвь git после начальной выборки в том же svn-remote

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

Вот мой текущий .git/config, который работает нормально.

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[svn-remote "svn"]
    url = https://svn.example.com/repository
    fetch = trunk/Python:refs/remotes/trunk
    branches = branches/{stage,prod,stage_with_proxy}/ucapi/:refs/remotes/*
    branches = branches/{active}/Python/:refs/remotes/*

Теперь я хочу добавить новую ветку:

    branches = branches/{fuze_node}/:refs/remotes/*

но при выполнении git svn fetch новая ветвь не видна в git. Он действует так, как будто строка не находится в конфиге.


Я знаю, что это можно сделать с помощью нового svn-remote, но я бы предпочел не брать эту дорогу.

Ответ 1

Для каждого svn-remote git -svn хранится последняя исправленная версия в файле .git/svn/.metadata. Он никогда не получает ревизий меньше, чем это значение. Вот почему он не получает ветку, добавленную в конфигурацию; git -svn считает, что ветвь fuze_node уже конвертирована.

Однако вы можете получить эту ветку без повторного клонирования всего репозитория еще раз:

  • Добавьте еще один svn-remote со всеми ветвями, которые нужно извлечь,
  • Удалите старый svn-remote;
  • Запустите git svn fetch -R newer-svn-remote, чтобы извлечь ревизии из добавленной ветки.

Ваша конфигурация должна выглядеть так:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
# [svn-remote "svn"]
#    url = https://svn.example.com/repository
#    fetch = trunk/Python:refs/remotes/trunk
#    branches = branches/{stage,prod,stage_with_proxy}/ucapi/:refs/remotes/*
#    branches = branches/{active}/Python/:refs/remotes/*
[svn-remote "newer-svn-remote"]
    url = https://svn.example.com/repository
    fetch = trunk/Python:refs/remotes/trunk
    branches = branches/{stage,prod,stage_with_proxy}/ucapi/:refs/remotes/*
    branches = branches/{active}/Python/:refs/remotes/*
    branches = branches/{fuze_node}/:refs/remotes/*

Обратите внимание, что вам нужно точно указать одно и то же отображение ветвей, как в старшем svn-remote:

    branches = branches/{stage,prod,stage_with_proxy}/ucapi/:refs/remotes/*

То есть, refs/remotes/* все равно будет находиться в правой части отображений. В противном случае git -svn не сможет обнаружить уже преобразованные коммиты и пытается извлечь их еще раз.


На самом деле есть другой способ добиться того же. Это связано с некоторыми манипуляциями с внутренними файлами git -svn.

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

[svn-remote "svn"]
    reposRoot = https://svn.example.com/repository
    uuid = 8a6ef855-a4ab-4527-adea-27b4edd9acb6
    branches-maxRev = 0
    tags-maxRev = 0

После этого git svn fetch выберет только необходимые изменения.