Импортируйте отдельные каталоги SVN как ветки git - PullRequest
3 голосов
/ 10 марта 2012

Я хочу преобразовать существующий репозиторий SVN с нестандартным макетом, который выглядит следующим образом:

/ (root)
    /trunk
        regular trunk stuff that I would like to make the "master" branch
    /folder1
        files that I would like to make a separate branch "folder1"
    /folder2
        files that I would like to make a separate branch "folder2"
    /folder3
        files that I would like to make a separate branch "folder3"

... в репозиторий git, сохраняя историю.

Подвох в том, чтоfolder1, folder2 и folder3 не разветвляются с некоторой точки в trunk;они представляют собой отдельный набор файлов, и они не имеют корня в каком-то удобном подкаталоге (что отличает этот вопрос от от того, который ).

Желаемая схема ветки git будет выглядеть следующим образом:

master -----+------(trunk r1)------(trunk r2)----...
            |
folder1     \-----(folder1 r1)----(folder1 r2)---...
            |
folder2     \-----(folder2 r1)----(folder2 r2)---...
            |
folder3     \-----(folder3 r1)----(folder3 r2)---...

(Эти номера ревизий не являются реальными номерами SVN, а просто номером коммита в этой конкретной папке)

Я пытался использовать git svn, но похожечтобы ветви были в одном каталоге, содержащем одну подпапку на ветку.Проблема в том, что если я сделаю это, мне придется использовать / (корневой каталог) в качестве каталога ветвей, что сделает trunk отдельной ветвью (хотя я хочу использовать его как master ветку).

Ответы [ 2 ]

4 голосов
/ 10 марта 2012

Вы можете сделать это, указав несколько «стволов» для git svn, отредактировав файл .git/config.

Инициализируйте ваш репозиторий git как обычно:

git svn init {url-to-repository} -T trunk

Теперь, если вы отредактируете файл .git/config, вы найдете раздел, который выглядит примерно так:

[svn-remote "svn"]
    url = {url-to-repository}
    fetch = trunk:refs/remotes/trunk

Просто добавьте несколько строк, подобных приведенным ниже, которые будут добавлять каждую папку как отдельную папку для выборки (в отличие от папки ветвей или папки тегов для выборки):

    fetch = folder1:refs/remotes/folder1
    fetch = folder2:refs/remotes/folder2
    ...
2 голосов
/ 10 марта 2012

У меня сложилось впечатление, что у вас действительно есть четыре отдельных репозитория, которые вы хотите отслеживать в одном репозитории git, причем каждый репозиторий находится в отдельной ветке. Не совсем то, как git предназначен для использования, но вы можете попробовать эту настройку конфигурации:

mkdir repo
cd repo

git init .
touch README
git add README
git commit -m "Initial repository"

git checkout -b folder1
mkdir folder1
touch folder1/svn-code-here # Add SVN files to folder1
git add folder1
git commit -m "folder1 branch"

git checkout master

git checkout -b folder2
mkdir folder2
touch folder2/svn-code-here # Add SVN files to folder2
git add folder2
git commit -m "folder2 branch"

git checkout master

git checkout -b folder3
mkdir folder3
touch folder3/svn-code-here # Add SVN files to folder3
git add folder3
git commit -m "folder3 branch"

git checkout master
touch svn-trunk-code-here # Add SVN files to trunk
git add svn-trunk-code-here
git commit -m "trunk started"

Это создаст три ветви вашей папки, в которых будет использоваться только общий файл README из первоначального trunk master. Это создаст граф ветвления как:

Git Branches

В приведенной выше последовательности команд вы должны заменить каждый touch svn-code-here командами и шагами, необходимыми для извлечения файлов SVN в каталог и добавления / commit для Git. Когда вы извлекаете master, ни один из каталогов папок не будет виден, и вы можете использовать master в качестве trunk и при необходимости переключаться между ветвями на папки git checkout folder1.

...