Obecnie mam lokalne repozytorium Git, które przekazuję do repozytorium Github.
Lokalne repozytorium zawiera ~ 10 zatwierdzeń, a repozytorium Github jest zsynchronizowanym duplikatem tego.
Chciałbym usunąć CAŁĄ historię wersji z lokalnego repozytorium Git, więc bieżąca zawartość repozytorium pojawi się jako jedyne zatwierdzenie (a zatem starsze wersje plików w repozytorium nie są przechowywane).
Chciałbym wtedy przekazać te zmiany Githubowi.
Zbadałem bazę Git, ale wydaje się, że jest to bardziej odpowiednie do usuwania określonych wersji. Innym potencjalnym rozwiązaniem jest usunięcie lokalnego repozytorium i utworzenie nowego - choć prawdopodobnie spowodowałoby to dużo pracy!
ETA: Istnieją określone katalogi / pliki, które nie są śledzone - jeśli to możliwe, chciałbym zachować śledzenie tych plików.
źródło
Odpowiedzi:
Oto podejście brutalnej siły. Usuwa również konfigurację repozytorium.
Uwaga : NIE działa to, jeśli repozytorium ma podmoduły! Jeśli korzystasz z submodułów, powinieneś użyć np. Interaktywnej bazy
Krok 1: Usuń całą historię ( upewnij się, że masz kopię zapasową, której nie można przywrócić )
Krok 2: zrekonstruuj repozytorium Git tylko z bieżącą zawartością
Krok 3: push do GitHub.
źródło
.gitignore
powinieneś sobie z tym poradzić, prawda?git commit -m "Initial commit"
, prawdopodobnie możesz pominąćgit remote add ...
część, zakładając, że była już w konfiguracji i przejść od razu do wypychania. To zadziałało dla mnie.Jedyne rozwiązanie, które działa dla mnie (i utrzymuje działanie podmodułów), to
Usuwanie
.git/
zawsze powoduje ogromne problemy, gdy mam submoduły. Używanie wgit rebase --root
jakiś sposób spowodowałoby dla mnie konflikty (i zajęło mi dużo czasu, odkąd miałem dużo historii).źródło
git push -f origin master
ostatnią operację, a słońce znów zaświeci na twoim świeżym repo! :)git gc --aggressive --prune all
całego punktu utraty historii nie można byłoby przegapić.Oto moje ulubione podejście:
Spowoduje to utworzenie nowej gałęzi z jednym zatwierdzeniem, która doda wszystko do HEAD. Nie zmienia niczego innego, więc jest całkowicie bezpieczny.
źródło
git-rev-parse
dokumentacji. To, co się tutaj dzieje,git-commit-tree
wymaga odwołania do drzewa (migawki repozytorium), aleHEAD
jest wersją. Aby znaleźć drzewo powiązane z zatwierdzeniem, używamy<rev>^{<type>}
formularza.git push --force <remote> new_branch_name:<remote-branch>
Inną opcją, która może okazać się bardzo pracochłonna, jeśli masz dużo zatwierdzeń, jest interaktywny rebase (zakładając, że twoja wersja git to> = 1.7.12):
git rebase --root -i
Po wyświetleniu listy zatwierdzeń w edytorze:
Zapisz i zamknij. Git zacznie się opierać.
Na koniec miałbyś nowy główny zatwierdzenie, które jest kombinacją wszystkich, które pojawiły się po nim.
Zaletą jest to, że nie musisz usuwać swojego repozytorium, a jeśli masz wątpliwości, zawsze masz awarię.
Jeśli naprawdę chcesz zniszczyć swoją historię, zresetuj master do tego zatwierdzenia i usuń wszystkie inne gałęzie.
źródło
error: failed to push some refs to
git push --force-with-lease
. użyto opcji przymusowej dzierżawy, ponieważ jest mniej niszcząca niż --force.Wariant proponowanej metody larsmansa :
Zapisz listę plików nieśledzących:
Zapisz swoją konfigurację git:
Następnie wykonaj pierwsze kroki larsmansa:
Przywróć konfigurację:
Wyśledzić wyśledzone pliki:
Następnie dokonaj:
I wreszcie wypchnij do swojego repozytorium:
źródło
Poniżej znajduje się skrypt zaadaptowany z odpowiedzi @Zeelot. Powinien usunąć historię ze wszystkich gałęzi, nie tylko gałęzi głównej:
Działa dla moich celów (nie używam submodułów).
źródło
git branch
będzie zawierać gwiazdkę obok wyewidencjonowanej gałęzi, która zostanie następnie globowana, powodując, że będzie ona rozpoznawana we wszystkich plikach lub folderach tak, jakby były to również nazwy gałęzi. Zamiast tego użyłem,git branch --format="%(refname:lstrip=2)"
co dało mi tylko nazwy oddziałów.git push --force origin master
lubgit push --force-with-lease
? Najwyraźniej ten drugi jest bezpieczniejszy (patrz stackoverflow.com/questions/5509543/… )Możesz użyć płytkich klonów (git> 1.9):
Dalsza lektura: http://blogs.atlassian.com/2014/05/handle-big-repositories-git/
źródło
git filter-branch
jest głównym narzędziem chirurgicznym.--parent-filter
dostaje rodziców na standardowe wyjście i powinien wydrukować przepisanych rodziców na standardowych; unixtrue
kończy działanie pomyślnie i nic nie drukuje, więc: brak rodziców.@^!
jest skrótem Git od słowa „głowa popełnia, ale żaden z jej rodziców”. Następnie usuń wszystkie inne referencje i pchaj w wolnym czasie.źródło
Wystarczy usunąć repozytorium Github i utworzyć nowe. Zdecydowanie najszybsze, najłatwiejsze i najbezpieczniejsze podejście. W końcu, co musisz zyskać, wykonując wszystkie te polecenia w zaakceptowanym rozwiązaniu, gdy wszystko, czego potrzebujesz, to gałąź master z jednym zatwierdzeniem?
źródło
Poniższa metoda jest dokładnie powtarzalna, więc nie trzeba ponownie uruchamiać klonowania, jeśli obie strony są spójne, wystarczy uruchomić skrypt również po drugiej stronie.
Jeśli chcesz to wyczyścić, wypróbuj ten skrypt:
http://sam.nipl.net/b/git-gc-all-ferocious
Napisałem skrypt, który „zabija historię” dla każdej gałęzi w repozytorium:
http://sam.nipl.net/b/git-kill-history
patrz także: http://sam.nipl.net/b/confirm
źródło
git-hash: not found
Support for <GIT_DIR>/info/grafts is deprecated
git log HEAD~${1:-0} -n1 --format=%H
tutaj sam.aiki.info/b/git-hash Lepiej byłoby umieścić to wszystko w jednym skrypcie do publicznego użytku. Jeśli kiedykolwiek go użyję, mogę wymyślić, jak to zrobić, dzięki nowej funkcji, która zastępuje „przeszczepy”.Bardziej konceptualna odpowiedź:
git automatycznie śmieci zbiera stare zatwierdzenia, jeśli nie wskazują na nie żadne tagi / gałęzie / referencje. Musisz więc po prostu usunąć wszystkie tagi / gałęzie i utworzyć nowe sieroce zatwierdzenie, powiązane z dowolną gałęzią - zgodnie z konwencją pozwolisz gałęzi
master
wskazywać na to zatwierdzenie.Stare, nieosiągalne zatwierdzenia nigdy już nie będą widoczne, chyba że zaczną kopać za pomocą poleceń git niskiego poziomu. Jeśli to ci wystarczy, zatrzymam się i pozwolę, aby automatyczny GC wykonał swoją pracę, kiedy tylko zechce. Jeśli chcesz się ich od razu pozbyć, możesz użyć
git gc
(być może z--aggressive --prune=all
). W przypadku zdalnego repozytorium git nie można tego wymusić, chyba że masz dostęp do powłoki systemu plików.źródło
Proszę bardzo:
Hostowane również tutaj: https://gist.github.com/Zibri/76614988478a076bbe105545a16ee743
źródło
Rozwiązałem podobny problem, po prostu usuwając
.git
folder z mojego projektu i ponownie integrując się z kontrolą wersji za pośrednictwem IntelliJ. Uwaga:.git
folder jest ukryty. Możesz go wyświetlić w terminalu za pomocąls -a
, a następnie usunąć za pomocąrm -rf .git
.źródło
W tym celu użyj polecenia Shallow Clone git clone --depth 1 URL - Sklonuje tylko bieżącą HEAD repozytorium
źródło
Więcej informacji tutaj.
Git tutoturial zapewnia pomoc dotyczącą czyszczenia repozytorium:
źródło