Obawiam się, że nie mogłem znaleźć czegoś takiego jak ten konkretny scenariusz.
Mam repozytorium git z dużą historią: ponad 500 oddziałów, ponad 500 tagów, od połowy 2007 roku. Zawiera ~ 19.500 zmian. Chcielibyśmy usunąć całą historię przed 1 stycznia 2010 r., Aby była mniejsza i łatwiejsza w obsłudze (trzymalibyśmy pełną kopię historii w repozytorium archiwum).
Wiem, że zatwierdzenie, które chcę stać się katalogiem głównym nowego repozytorium. Nie mogę jednak wymyślić właściwego git mojo, aby obciąć repozytorium i zacząć od tego zatwierdzenia. Zgaduję jakiś wariant
git filter-branch
konieczne byłyby przeszczepy; może być również konieczne potraktowanie każdego z ponad 200 oddziałów, które chcemy zachować osobno, a następnie załatanie repo z powrotem razem (coś, co robię wiem, jak to zrobić).
Czy ktoś kiedykolwiek zrobił coś takiego? Mam git 1.7.2.3, jeśli to ma znaczenie.
źródło
git filter-branch --tag-name-filter cat -- --all
aby zaktualizować tagi. Ale mam też starsze tagi wskazujące na starą historię, którą chcę usunąć. Jak mogę pozbyć się wszystkich starych tagów? Jeśli ich nie usunę, starsza historia nie zniknie i nadal mogę to zobaczyćgitk --all
.echo "<NEW-ROOT-HASH>" > .git/info/grafts
Być może jest już za późno na opublikowanie odpowiedzi, ale ponieważ ta strona jest pierwszym wynikiem Google, może być nadal pomocna.
Jeśli chcesz zwolnić trochę miejsca w swoim repozytorium git, ale nie chcesz odbudowywać wszystkich swoich commits (rebase lub graft) i nadal możesz wypychać / wyciągać / scalać osoby, które mają pełne repo, możesz użyć git klon płytki klon ( parametr --depth ).
Możesz być w stanie spłycić swoje istniejące repozytorium, wykonując następujące kroki:
Jak usunąć wszystkie lokalne tagi git?
Ps: Starsze wersje git nie obsługiwały klonowania / wypychania / ściągania z / do płytkich repozytoriów.
źródło
cd
przejść do folderu, który właśnie został usunięty? Mam wrażenie, że brakuje tutaj niektórych informacji. Czy jest też sposób na zastosowanie tych zmian w zdalnym repozytorium?git clone file:///Users/me/Projects/myProject myClonedProject --shallow-since=2016-09-02
Działa jak urok!git filter-branch -- --all
. Spowoduje to zmianę wszystkich skrótów, ale potem będziesz mógł przekazać go do nowego repozytoriumTa metoda jest łatwa do zrozumienia i działa dobrze. Argumentem script (
$1
) jest odwołanie (tag, skrót, ...) do zatwierdzenia, od którego chcesz zachować swoją historię.UWAGA: stare tagi nadal będą obecne; więc może być konieczne ich ręczne usunięcie
Uwaga: Wiem, że jest to prawie taka sama odpowiedź jak @yoyodin, ale są tu ważne dodatkowe polecenia i informacje. Próbowałem edytować odpowiedź, ale ponieważ jest to istotna zmiana w odpowiedzi @ yoyodin, moja edycja została odrzucona, więc oto informacje!
źródło
git prune
igit gc
. Czy istnieje wyjaśnienie dla pozostałych poleceń w skrypcie? W tej chwili nie jest jasne, jakie argumenty są przekazywane i co robi każde polecenie. Dzięki.-p
dorebase
polecenia, jak sugerowano w innej odpowiedziWypróbuj tę metodę Jak obciąć historię git :
Tutaj
$1
jest SHA-1 z popełnić chcesz zachować i skrypt utworzy nowy oddział, który zawiera wszystkie zobowiązuje między$1
amaster
i cała historia jest starsza spadła. Zauważ, że ten prosty skrypt zakłada, że nie masz istniejącej gałęzi o nazwietemp
. Zauważ też, że ten skrypt nie usuwa danych git ze starej historii. Uruchomgit gc --prune=all && git repack -a -f -F -d
po sprawdzeniu, czy naprawdę chcesz stracić całą historię. Możesz także potrzebować,rebase --preserve-merges
ale ostrzegam, że implementacja git tej funkcji nie jest idealna. Sprawdź wyniki ręcznie, jeśli z nich korzystasz.źródło
rebase
krok po kroku dostałem konflikty scalania . Dziwne - nie spodziewałem się, że w takich okolicznościach możliwe będą konflikty scalania.git commit --allow-empty -m "Truncate history"
jeśli zatwierdzone przez Ciebie zatwierdzenie nie zawiera żadnych plików.Jako alternatywę dla przepisywania historii, rozważ użycie
git replace
jak w tym artykule z książki Pro Git . Omawiany przykład obejmuje zastąpienie zatwierdzenia nadrzędnego w celu symulacji początku drzewa, przy jednoczesnym zachowaniu pełnej historii jako oddzielnej gałęzi do przechowywania.źródło
git replace
. Myślę, że to zostało poprawione w innym pytaniu, w którym opublikowałeś tę odpowiedź.git replace
kontragit graft
jest przeprowadzana na stackoverflow.com/q/6800692/873282Jeśli chcesz zachować na upstream repozytorium z pełnej historii , ale mniejszych lokalnych kasach, zrobić klon z płytką
git clone --depth=1 [repo]
.Po wciśnięciu zatwierdzenia możesz to zrobić
git fetch --depth=1
przycinać stare zobowiązania. To sprawia, że stare zmiany i ich obiekty są nieosiągalne.git reflog expire --expire-unreachable=now --all
. Aby wygasnąć wszystkie stare commity i ich obiektygit gc --aggressive --prune=all
aby usunąć stare obiektyZobacz także Jak usunąć lokalną historię git po zatwierdzeniu? .
Pamiętaj, że nie możesz wypchnąć tego „płytkiego” repozytorium w inne miejsce: „płytka aktualizacja nie jest dozwolona”. Zobacz Zdalne odrzucenie (płytka aktualizacja niedozwolona) po zmianie zdalnego adresu URL Git . Jeśli chcesz to zrobić, musisz trzymać się szczepienia.
źródło
Musiałem przeczytać kilka odpowiedzi i kilka innych informacji, aby zrozumieć, co robię.
1. Zignoruj wszystko starsze niż określony zatwierdzenie
Plik
.git/info/grafts
może definiować fałszywych rodziców dla zatwierdzenia. Linia z tylko identyfikatorem zatwierdzenia mówi, że zatwierdzenie nie ma rodzica. Jeśli chcielibyśmy powiedzieć, że zależy nam tylko na ostatnich 2000 zatwierdzeniach, możemy wpisać:git rev-parse podaje nam identyfikator zatwierdzenia 2000. rodzica bieżącego zatwierdzenia. Powyższe polecenie zastąpi plik przeszczepów, jeśli jest obecny. Sprawdź, czy jest tam pierwszy.
2. Przepisz historię Git (opcjonalnie)
Jeśli chcesz, aby ten szczepiony fałszywy rodzic był prawdziwym rodzicem, uruchom:
Zmieni wszystkie identyfikatory zatwierdzeń. Każda kopia tego repozytorium musi zostać silnie zaktualizowana.
3. Oczyść miejsce na dysku
Nie zrobiłem kroku 2, ponieważ chciałem, aby moja kopia była zgodna z wersją wstępną. Chciałem tylko zaoszczędzić trochę miejsca na dysku. Aby zapomnieć o wszystkich starych zobowiązaniach:
Alternatywnie: płytkie kopie
Jeśli masz płytką kopię innego repozytorium i po prostu chcesz zaoszczędzić trochę miejsca na dysku, możesz zaktualizować
.git/shallow
. Ale uważaj, aby nic nie wskazywało na zatwierdzenie wcześniej. Abyś mógł uruchomić coś takiego:Wpis w płytkiej pracy działa jak przeszczep. Ale uważaj, aby nie używać jednocześnie przeszczepów i płytki. Przynajmniej nie miej tam takich samych wpisów, to się nie powiedzie.
Jeśli nadal masz jakieś stare odwołania (tagi, gałęzie, zdalne głowy), które wskazują na starsze zatwierdzenia, nie zostaną one wyczyszczone i nie zaoszczędzisz więcej miejsca na dysku.
źródło
git replace
zamiast tego. Zobacz stackoverflow.com/questions/6800692/…Kiedy rebase lub przeć do głowy / Master może wystąpił ten błąd
Aby rozwiązać ten problem w panelu git, należy usunąć gałąź główną z „gałęzi chronionych”
możesz uruchomić to polecenie
lub
źródło
Jest tu zbyt wiele odpowiedzi, które nie są aktualne, a niektóre nie w pełni wyjaśniają konsekwencje. Oto, co zadziałało dla mnie, aby skrócić historię za pomocą najnowszego gita 2.26:
Najpierw utwórz atrapę zatwierdzenia. To zatwierdzenie pojawi się jako pierwsze zatwierdzenie w skróconym repozytorium. Potrzebujesz tego, ponieważ to zatwierdzenie pomieści wszystkie pliki podstawowe dla historii, którą przechowujesz. SHA jest identyfikatorem poprzedniego zatwierdzenia, które chcesz zachować (w tym przykładzie
8365366
). Ciąg „Initial” pojawi się jako komunikat zatwierdzenia pierwszego zatwierdzenia. Jeśli używasz systemu Windows, wpisz poniżej polecenie z wiersza polecenia Git Bash.Powyższe polecenie wyświetli SHA, na przykład
d10f7503bc1ec9d367da15b540887730db862023
.Teraz wystarczy wpisać:
Spowoduje to, że najpierw umieści wszystkie pliki w zatwierdzeniu
8365366
jako atrapyd10f750
. Następnie odtworzy wszystkie zatwierdzenia po 8365366 ponadd10f750
. Wreszciemaster
wskaźnik gałęzi zostanie zaktualizowany do ostatniego odtworzenia zatwierdzenia.Teraz, jeśli chcesz wypchnąć te obcięte repozytorium, po prostu zrób
git push -f
.Kilka rzeczy, o których należy pamiętać (dotyczy to zarówno innych metod, jak i tej): Tagi nie są przenoszone. Podczas gdy identyfikatory zatwierdzania i znaczniki czasu są zachowane, GitHub pokaże te zatwierdzenia w nagłówkach typu lumpsum
Commits on XY date
.Na szczęście możliwe jest zachowanie okrojonej historii jako „archiwum”, a później można dołączyć przycięte repozytorium z repozytorium archiwum. Aby to zrobić, zobacz ten przewodnik .
źródło
możesz usunąć katalog, pliki, a także całą historię związaną z katalogiem lub plikiem za pomocą niżej wymienionego jar [pobierz go] i poleceń
plik bfg.jar: https://rtyley.github.io/bfg-repo-cleaner/
git clone --bare repo-url cd repo_dir java -jar bfg.jar --delete-foldery nazwa_folderu git reflog wygasają --expire = teraz --all && git gc --prune = teraz - agresywny git push --mirror repo_url
źródło
źródło