Импортирайте отделни 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 от създадения първоначален trunk master. Това ще създаде разклонена графика като:

Git клонове

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

person tawman    schedule 10.03.2012
comment
Проблемът с това е, че не мисля, че е възможно да се импортират ангажименти от SVN, след като Git хранилището вече има някои ангажименти в него :( Това на практика би изисквало добавяне на ангажименти от миналото. Това и git svn предполага, че трябва да проверява нещата в клон master, дори когато съм в клон folderx. - person Etienne Perot; 10.03.2012
comment
@EtiennePerot всеки клон има своя собствена времева линия, тъй като те никога няма да бъдат обединени обратно заедно с master, но лично бих препоръчал всяка папка като отделно хранилище. - person tawman; 10.03.2012
comment
Да, но всички те се разклоняват от този първи ангажимент в master, където е добавен README, което означава, че тяхната времева линия започва там. Като се има предвид това, ангажиментите не могат да бъдат импортирани от SVN, тъй като SVN хранилището не съдържа такъв README файл (така че наистина няма смисъл да продължавате да добавяте ангажименти към дърво, което не е идентично на SVN-repo) но също и защото тези ангажименти от 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