Я использую git-svn
для работы с центральным хранилищем Subversion моей компании. Недавно мы создали новую функциональную ветку в центральном репо.
Как мне рассказать об этом Git? Когда я запускаю, git branch -r
я вижу только те ветки, которые существовали, когда я запускал fetch
репозиторий Subversion для инициализации моего репозитория Git?
Ответы:
Вы можете вручную добавить удаленную ветку,
источник
fatal: Cannot setup tracking information; starting point 'newbranch' is not a branch.
на шаге Git Checkout.Если вы хотите отслеживать ВСЕ удаленные ветви SVN, то решение так же просто, как:
Это позволит получить ВСЕ удаленные ветви, которые еще не были выбраны.
Дополнительный совет: если вы сначала извлекли только ствол, а затем хотите отследить ВСЕ ветви, то отредактируйте,
.git/config
чтобы это выглядело так, и снова запуститеgit svn fetch
:Ключевые моменты
url
должны указывать на корень хранилища, а пути, определенные вfetch
иbranches
должны быть относительноurl
.Если вы хотите выбрать только определенные ветви вместо ALL, есть хороший пример
git svn --help
:В старых версиях после того
git-svn
, как вы указали такие ветки, вы не сможете получать новые веткиgit svn fetch
. Один из обходных путей - добавление дополнительныхfetch
строк, например:Другой обходной путь @AndyEstes: отредактируйте
.git/svn/.metadata
и измените значениеbranches-maxRev
илиtags-maxRev
на ревизию до того, как были созданы какие-либо вновь указанные ветви или теги. Как только вы это сделаете, запустите,git svn fetch
чтобы отследить новую удаленную ветку svn.источник
.git/svn/.metadata
было очень полезным! Я добавлял в свою ветку дополнительные ветки.git/config
, которыеgit svn fetch
не улавливались - потому что номер редакции метаданных был «слишком далеко вперед». В одном случае был выбран только последний коммит из ветви. Я вручную избавился от неисправной ветви (переименованной.git/svn/refs/remotes/svn/qa/XYZ
к.git/svn/refs/remotes/svn/qa/XYZ~
, уронил свое существование в.git/packed-refs
и т.д.) ... взял в «ранний» номер версии для метаданных ... Ран ,git svn fetch
чтобы , наконец , получить полную историю ж / правильно, связной графа.git svn fetch --all
.Похоже, мне просто нужно было
git svn fetch
; каким-то образом я убедил себя, что получу весь репо, а не только изменения.источник
Может быть, я как-то испортил это, но я следовал инструкциям в ответе Вьянгуса, и это почти сработало. Единственная проблема состояла в том, что newbranch, казалось, не был отделен от ствола. В gitk это было своего рода «плавающее» все само по себе; у него не было общего предка с туловищем.
Решение этого было:
git diff-tree <sha1 from step 1> <sha1 from step 2>
- не должно быть выхода. Если вывод есть, возможно, вы выбрали неправильные коммиты.git checkout local-newbranch
тогдаgit rebase <sha1 from step 1>
. Это переместитсяlocal-newbranch
на новое дерево, ноremotes/newbranch
все равно будет отключено..git/refs/remotes/newbranch
и отредактируйте его, чтобы он содержал полный SHA1 нового коммита (на перебазированномnewbranch
), который соответствует старому коммиту, на который он в данный момент указывает. (Или может использоватьgit-update-ref refs/remotes/newbranch <new-SHA>
. Спасибо, Пингер.)git svn dcommit
наnewbranch
, вы получите кучу сообщений о нем обновляемых некотором журнале. Я думаю, это нормально.Я рекомендую держать
gitk --all
все время открытым и обновлять его, чтобы следить за тем, что вы делаете. Я все еще новичок в git и git svn, поэтому, пожалуйста, предложите усовершенствования этого метода.источник
Упрощение ответа Вьянгуса:
Если вы используете стандартную компоновку в SVN и выполнили обычный svn init, git-svn сделает все за вас. Просто:
Пример. URL-адрес SVN есть
svn+ssh://gil@svn.myplace.com/repo
. Я ищу ветку SVNnewbranch
. Локальная ветка git (отслеживание удаленногоnewbranch
) будетgit-newbranch
.Шаг 1: найдите редакцию ветки-копии
Таким образом, точка ветвления в SVN - это версия 7802.
Шаг 2: Получить ревизию
git-svn сделал всю работу и теперь знает о пульте:
Шаг 3: Создайте новую локальную ветку, отслеживающую удаленную:
источник
show-ref
бесценно)! Для тех, кто застрял с ошибочной ссылкой на удаленные ветки, вы можете удалить их (я должен был сделать,git branch -d newbranch
а затем принудительно удалить ссылку ref.git/svn/refs/remotes/newbranch
), а затем начать заново с шага 2 (выше).Я не нашел никакой документации об этой функции, но похоже, что конфигурация git svn поддерживает несколько записей выборки. Таким образом, вы также можете добавлять ветки отдельно, без необходимости добавления другой записи удаленного svn-репозитория в вашу конфигурацию или использования подстановочных знаков для получения всех веток определенного каталога.
Предположим, что ваше дерево SVN действительно противное, с множеством веток без какой-либо логики их расположения, например, с ветвями и подкаталогами, содержащими более разветвленные.
т.е.
и вы просто хотите вручную выбрать некоторые ветви, которые будут включены в ваш репозиторий git.
Сначала вы можете запустить свой репозиторий только с транком без каких-либо дополнительных веток:
После этого вы должны увидеть следующую конфигурацию:
когда вы хотите получить новую ветку из MyRepo, вы можете просто добавить новые записи в конфигурацию:
Или вы можете отредактировать ту же конфигурацию в .git / config
Чтобы получить новые ветки после добавления их в конфигурацию, просто запустите:
[Edit] Иногда кажется необходимым запустить fetch с параметром --all, чтобы получить новые добавленные ветки:
источник
Вместо того, чтобы иметь дело с причудами git-svn, вы можете попробовать SubGit .
Нужно установить SubGit в хранилище Subversion. После этого можно использовать стандартный рабочий процесс git вместо специальных команд git-svn:
Нажатие новых коммитов:
ГИТ-SVN:
SubGit:
Получение входящих изменений
ГИТ-SVN:
SubGit:
Создание новой ветки:
ГИТ-SVN:
SubGit:
См. Документацию SubGit для более подробной информации.
источник
Чтобы добавить к ответу vjangus, который мне помог, я также счел полезным добавить использование git-графтов для привязки веток к стволу в соответствующей точке - что позволяет git правильно просматривать историю и выполнять слияния.
Это просто случай добавления строки
.git/info/grafts
с хешами:например.
Кредит http://evan-tech.livejournal.com/255341.html
(Я бы добавил это как комментарий, но у меня недостаточно репутации.)
источник
Если вы не выберете действительный макет, вы не сможете оформить удаленную ветку.
Вот что я делаю:
После этого вы можете переключиться на удаленную ветку:
Тогда вы автоматически переключитесь на свою ветку.
источник