Импортировать отдельные каталоги SVN как ветки git

Я хочу преобразовать существующий репозиторий 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).


person Etienne Perot    schedule 09.03.2012    source источник


Ответы (2)


Вы можете сделать это, указав несколько «соединительных линий» для 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
    ...
person me_and    schedule 10.03.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 из исходного главного ствола. Это создаст такой граф ветвей:

Ветви Git

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

person tawman    schedule 10.03.2012
comment
Проблема в том, что я не думаю, что можно импортировать коммиты из SVN, если в репозитории Git уже есть некоторые коммиты :( Для этого фактически потребовалось бы добавить коммиты из прошлого. Это, и git svn предполагает, что он должен что-то проверять в ветке master, даже когда я в ветке folderx. - person Etienne Perot; 10.03.2012
comment
@EtiennePerot каждая ветка имеет свою временную шкалу, поскольку они никогда не будут объединены вместе с мастером, но я бы лично рекомендовал каждую папку как отдельный репозиторий. - person tawman; 10.03.2012
comment
Да, но все они ответвляются от той первой фиксации в master, где добавляется README, что означает, что их временная шкала начинается там. Учитывая это, коммиты не могут быть импортированы из SVN, потому что репозиторий SVN не содержит такого README файла (поэтому на самом деле нет смысла продолжать добавлять коммиты в дерево, не идентичное SVN-репо) но также потому, что эти коммиты из SVN намного старше (по метке времени), чем этот README коммит в master (который был сделан только что) - person Etienne Perot; 10.03.2012
comment
Вы пытаетесь сохранить историю svn? Если нет, то специального импорта не требуется. Мой подход был основан на свежей истории, основанной на svn head. - person tawman; 10.03.2012
comment
Да, я стараюсь сохранить всю историю, вот что делает ее сложной. Извините, если это непонятно, я отредактирую вопрос, чтобы упомянуть об этом. - person Etienne Perot; 10.03.2012