2016-11-04 9 views
1

Моя СВН структура такова:Как git клонировать репозиторий SVN, где все ветки расположены в корне?

/ 
|-- Branch1 
|-- Branch2 
|-- Branch3 
... 

Как я могу клонировать это в репозиторий, сохраняющей ветви (т.е. не плоская история)?

Бонусный вопрос: как клонировать только подмножество ветвей SVN в новый репозиторий git?

+0

Это однократное преобразование из SVN в Git, а затем используется только Git или вы хотите перевести обратно из Git в SVN? – Vampire

+0

Это разовое преобразование, но я хочу, чтобы иметь возможность перенаправлять новые SVN-записи на мой git-репо. – user1709708

ответ

0

Я считаю, что в ветвях SVN есть только папки, это просто соглашение. Гит работает с филиалами. При этом подход становится проще.

Как вам нужно получить данные из репозитория SVN, вам нужно будет создать удаленный доступ к нему. Из структуры я вижу, что вам нужно создать ветви с 1 по 3 в вашем репозитории git.

Создать репозиторий Git.

git init 
git config --local --add user.name <Username> 
git config --local --add user.email <email> 
echo "MASTER" > master 
git add master 
git commit -m "Dummy commit" 

Создать удаленный филиал SVN.

git config --add svn-remote.<BranchName>.url <SVN URL> 
git config --add svn-remote.<BranchName>.fetch :refs/remotes/<RemoteName> 

для branch1:

git config --add svn-remote.branch1.url https://svnhost/svn/MyRepo/Branch1 
git config --add svn-remote.branch1.fetch :refs/remotes/branch1_remote 

Выборка данных из SVN branch1:

git svn fetch branch1 

Повторите это для других двух ветвей branch2 и Branch3.

Вы можете остановиться прямо здесь, если вы только пытаетесь клонировать. Вам не нужно идти дальше, если вы не хотите работать с репозиторием Git. Google в поддереве git, чтобы знать, почему это может быть правильным решением в вашем случае.

Создание Subtree:

Find last commit id: 
git checkout remotes/branch1_remote 
git svn log -n 1 --show-commit --oneline 
Output: 734713bc047d87bf7eac9674765ae793478c50d3 (This is yout LastCommitId value) 

Create subtree in mainline master branch: 
git checkout master 
git subtree add --prefix=Branch1 <LastCommitId> 

Для вас бонусный вопрос: Попробуйте

git svn clone https://svnhost/svn/MyRepo/Branch2 

Это один простой, другой способ следовать выше шаги, и вместо того, чтобы создать три пульта дистанционного управления в то же хранилище создает новый репозиторий каждый раз, а затем добавляет удаленный филиал. Основываясь на вашем требовании, вы можете использовать различные способы Google.

0

Клонировать только первые несколько ревизий только туловища, прежде чем были созданы какие-либо ветви. Я предполагаю, что ваши ветви не были созданы до версии 5. Я также предполагаю, что ваша папка с багажником называется trunk. Отрегулируйте соответствующим образом. Надеюсь, вы уже создали файл авторов. Это создаст локальный репозиторий.

$ git svn clone https://svn.example.com/myrepo --authors-file=authors.txt -T trunk -r 1:5 myrepo 

Далее добавьте branches линии в myrepo/.git/config похожее на это:

[svn-remote "svn"] 
    url = https://svn.example.com/myrepo 
    fetch = trunk:refs/remotes/origin/trunk 
    branches = branches/Branch1:refs/remotes/origin/* 
    branches = branches/Branch2:refs/remotes/origin/* 
    branches = branches/Branch3:refs/remotes/origin/* 

Если ветви следовать соглашению об именах, которые могут быть сопоставлены с рисунком, как в вашем примере, вы можете сделать это:

[svn-remote "svn"] 
    url = https://svn.example.com/myrepo 
    fetch = trunk:refs/remotes/origin/trunk 
    branches = branches/Branch*:refs/remotes/origin/* 

Некоторые люди рекомендуют удалять myrepo/.git/svn/.metadata после внесения этих изменений. Я не знаю, нужно это или нет.

Теперь вы просто принесите оставшиеся версии. Git svn разработает структуру филиала и сделает все правильно. Любые ветки, которые не соответствуют одной из линий branches, будут игнорироваться.

$ cd myrepo 
$ git svn fetch 

После того, как оно будет завершено, вы можете проверить, что ветви были созданы с помощью этой команды.

$ git branch -r 
    origin/Branch1 
    origin/Branch2 
    origin/Branch3 
    origin/trunk