2011-01-15 14 views
27

Jak mogę przekonwertować już sklonowane repozytorium git do płytkiego repozytorium?Konwersja repozytorium git na płytkie?

Repozytorium git jest pobierane przez skrypt poza moją kontrolą, więc nie mogę zrobić płytkiego klonu.

Powodem tego jest zaoszczędzenie miejsca na dysku. (Tak, jestem naprawdę mało miejsca na dysku, więc chociaż płytkie repozytorium nie zaoszczędzić dużo, to jest potrzebne.)

Próbowałem już

git repack -a -d -f -depth=1 

Ale to faktycznie repozytorium większe.

+0

http://stackoverflow.com/questions/1398919/make-git-consume-less-disk-space/1400849#1400849 może pomóc. Co daje 'git gc' po twoim przepakowaniu? – VonC

+0

huitseeker: Dzięki za przedstawienie. Zdaję sobie sprawę z ograniczeń i nie przeszkadza mi to. Potrzebuję dostępu do ostatniego zatwierdzenia, lub idealnie kilku commitów, ale to wszystko. – Robert

+0

VonC: Teraz robię gc --aggressive. Powinienem coś z tego zyskać, ale jeśli to możliwe, chciałbym też upuścić przedmioty, których nie potrzebuję. – Robert

Odpowiedz

-6

Załóżmy, że najwcześniejsze zatwierdzenie, które chcesz zachować, ma SHA1 z c0ffee.

  1. Create a new empty branch
  2. kasie drzewo z pierwszych popełnić chcesz zachować, bez faktycznie sprawdzania commit: git checkout c0ffee -- . (Teraz HEAD wciąż skierowaną do nowego pustego oddziału, ale drzewa i wskaźnik pracy obie wyglądają jak drzewa c0ffee)
  3. popełnienia całego drzewa: git commit -m "Initial commit, copied from c0ffee"
  4. w tym momencie git diff-tree newbranch c0ffee powinna produkować nie ma wyjścia - mają takie samo drzewo. (Alternatywnie, można zrobić git show -s c0ffee --format=%T i git show -s newbranch --format=%T i powinny one pokazują ten sam hash.)
  5. git rebase --onto newbranch c0ffee master
  6. git branch -d newbranch
  7. git gc
+0

Dziękujemy! To było dokładnie to, czego potrzebowałem. Teraz, gdybym tylko mógł zrozumieć, dlaczego czuję potrzebę kawy? – Robert

+4

To nie konwertuje repozytorium na płytkie jako płytkiego klonu byłoby z 'git clone --depth = n ', i nie można go było cofnąć za pomocą git' fetch --unshallow'. –

11

Można konwertować git repo do płytkiego jednym miejscu wzdłuż tej linii :

git show-ref -s HEAD > .git/shallow 
git reflog expire --expire=0 
git prune 
git prune-packed 

Pamiętaj, aby wykonać kopię zapasową, ponieważ jest to działanie destrukcyjne, należy również pamiętać, że podczas klonowania ani pobierania z płytkiego repozytorium nie jest obsługiwane! Aby naprawdę usunąć całą historię, musisz również usunąć wszystkie odwołania do poprzednich zatwierdzeń przed przycinaniem.

+3

Właściwie to nic nie robi. – hendry

+0

hendry: Najprawdopodobniej nie usunąłeś innych odniesień wskazujących na historię HEAD. Spróbuj usunąć wszystkie pozostałe gałęzie i znaczniki przed wykonaniem tych kroków. – user212328

+0

Dla submodułów może być konieczne rozwiązanie pliku '.git' do katalogu git (' git rev-parse --git-dir'). Możesz również użyć polecenia 'git description --always HEAD ~ 5' zamiast' show-ref -s HEAD', aby zachować najnowsze zatwierdzenia. Następnie w międzyczasie pojawia się 'git fetch --unshallow', aby oddzielić klon. – blueyed

10

Ten pracował dla mnie:

git pull --depth 1 
git gc --prune=all 
+0

Wyjątkowo prosta i bezpośrednia. Kocham to. – tzrlk

+0

Hmm dla mnie daje to "fatal: git fetch-pack: oczekiwana płytka lista" na pociągnięciu. –

+0

@BenFarmer Cóż, nie jest dobrze! Ponieważ płytka obsługa powoli się rozwija, prawdopodobnie działa tylko na najnowszych wersjach gita. Jaką masz wersję? – fuzzyTew

0

Rozwiązanie:

git clone --depth 1 file:///full/path/to/original/dir destination 

Zauważ, że pierwszy "adres" powinno być file://, że to ważne. Ponadto, git przyjmie twój pierwotny lokalny plik: // adres jako "zdalny" ("origin"), więc będziesz musiał zaktualizować nowe repozytorium, określając poprawną git remote.