2013-02-22 17 views
93

Chciałbym zdefiniować nową gałąź "root" w tym repozytorium git. Przez gałąź "root" rozumiem gałąź, która jest całkowicie niezależna od wszystkich innych gałęzi w repozytorium .Jak utworzyć nową (i pustą!) Gałąź "root"?

Niestety, nawet zatwierdzenie (nazwijmy to A) na samym początku drzewa zatwierdzania repo zawiera wiele plików (było to repozytorium zainicjowane na już dość dojrzałym projekcie).

Oznacza to, że nawet jeśli dałem A jako nowego oddziału <start-point>, ten nowy oddział nie ruszy z „czystym kontem”, ale raczej będzie ona zawierać wszystkie pliki, które zostały popełnione w A.

Czy jest jakiś sposób mogę stworzyć zupełnie gołe oddział w tym repozytorium, z <start-point> tak blisko A jak to możliwe?


okazji, to nie równoważne do tworzenia nowego repo. Oddzielne transakcje repo byłyby mniej wygodne z wielu powodów.


EDIT: OK, to jest to, co zrobiłem, na podstawie vcsjones 'Odpowiedź:

# save rev of the current earliest commit 
OLDBASE=$(git rev-list --max-parents=0 HEAD) 

# create a new orphan branch and switch to it 
git checkout --orphan newbranch 
# make sure it's empty 
git rm -rf . 

# create a new empty commit in the new branch, and 
# save its rev in NEWBASE 
git commit --allow-empty -m 'base commit (empty)' 
NEWBASE=$(git rev-list HEAD) 

# specify $NEWBASE as the new parent for $OLDBASE, and 
# run filter-branch on the original branch 
echo "$OLDBASE $NEWBASE" > .git/info/grafts 
git checkout master 
git filter-branch 

# NOTE: this assumes that the original repo had only one 
# branch; if not, a git-filter-branch -f <branch> command 
# need to be run for each additional branch. 

rm .git/info/grafts 

Chociaż ta procedura jest nieco zaangażowane, wynik końcowy jest pusty podstawowa instrukcja zatwierdzenia, która może służyć jako <start-point> dla każdej nowej "czystej gałęzi"; wszystko bym trzeba zrobić wtedy jest

git checkout -b cleanslate $(git rev-list --max-parents=0 HEAD) 

W przyszłości będę zawsze tworzyć nowe repozytoria tak:

git init 
git commit --allow-empty -m 'base commit (empty)' 

... tak, że pierwszy popełnić jest pusty, i zawsze dostępne do założenia nowego niezależnego oddziału. (Byłoby to, co wiem, to bardzo rzadko potrzebne zakład, ale to jest zupełnie bez wysiłku, aby go łatwo dostępne.)

+0

Duplikat http://stackoverflow.com/questions/13969050/how-to-create-a-new-empty-branch-for-a-new-project – Anonymoose

+1

@ Anonimoose: Tylko dla zapisu (zamiast debaty): nie zgadzam się z twoją opinią. – kjo

+1

Wydaje się, że istnieje znacznie prostsze rozwiązanie oparte na 'git rebase --onto', zobacz http://stackoverflow.com/questions/645450/insert-a-commit-before-the-root-commit-in-git –

Odpowiedz

151

Użyj --orphan przy tworzeniu oddziału:

git checkout --orphan YourBranchName 

Spowoduje to utworzenie nowego gałąź z zerowym zatwierdzeniem, jednak wszystkie twoje pliki zostaną zainscenizowane. W tym momencie możesz je po prostu usunąć.
(„usuń je”: a git reset --hard będzie opróżnić indeks, dzięki czemu można z pustym drzewie roboczego)

Spójrz na man page na kasie, aby uzyskać więcej informacji na temat --orphan.

+0

Czy to zasadniczo tworzy pustą tablicę? Jak w od zera? Czy zachowuje wszystkie poprzednie zmiany, ale nie w historii git? –

+1

@ConAntonakos Tworzy nowy oddział bez rodzica. Pozostałe gałęzie pozostają nienaruszone, wszystkie ich zmiany są zachowywane. – fuz

1

Aby dodać do przyjętej odpowiedź - best practice powrócić do czyszczenia stan jest stworzenie an initial empty commit, dzięki czemu można łatwo zmieniają bazę podczas konfigurowania oddziały dla potomności. Dodatkowo, ponieważ chcesz mieć czysty stan, prawdopodobnie masz zatwierdzone pliki, których nie powinieneś, więc musisz usunąć je z indeksu.Z tych na uwadze, należy:

$ git checkout --orphan dev2 
Switched to a new branch 'dev2' 
$ git reset # unstage all the files, you probably don't want to commit all of them 
$ git commit --allow-empty -m 'Initial empty commit' 
[dev2 (root-commit) a515c28] Initial empty commit 
Powiązane problemy