2015-04-20 10 views

Antwort

32

Sie ein

tun können
git clone <git_url> 

das .git Repository aus dem Ordner löschen. Dadurch wird Ihr gesamter Verlauf gelöscht.

Das können Sie einen

git init 

tun, was für Sie ein völlig neues git Projekt schaffen.

Dies ist möglicherweise nicht der beste Weg. Aber das wird funktionieren. Ich hoffe es hilft.

+4

Es wird höchstwahrscheinlich alle Submodule entfernen. –

+0

@AleksanderAlekseev über welche Submodule sprichst du? – Willa

+0

Wenn Sie die Historie nicht benötigen, ist dies die einfachste Lösung. – Willa

11

Solange Sie einen vollständigen Verlust der Geschichte als kein Problem betrachten, ist der von Ajay vorgeschlagene Ansatz vollkommen gültig. Aber wenn Sie die Geschichte Ihres flachen Klons beibehalten möchten, habe ich einen anderen Vorschlag.


Ein flacher Klon gibt vor, durch die Verwendung eines so genannten graft point zu fälschen die Eltern der „ersten“ verpflichten sich die vollständige Geschichte haben.

Wenn wir davon ausgehen, dass wir die volle Geschichte zur Verfügung haben, könnten wir die Frage anders formulieren: How can I throw away the history before a specific revision?

Dies bedeutet, dass wir eine Kombination aus einem Pfropf-Punkt verwenden können und git filter-branch (wie in der verknüpften Frage vorgeschlagen). Sie müssen jedoch beachten, dass dies Ihre gesamte Geschichte umschreibt, wodurch die neue Geschichte mit der Fernbedienung unvereinbar wird, von der wir ursprünglich geklont haben. Aus diesem Grund sollten wir die alte Fernbedienung aus unserem Repository entfernen.

git remote remove <old-remote-name> 

Jetzt können wir unsere Neufassung beginnen. Nehmen wir an, wir wollen Master den neuen Root für das Repository committen.

Dies wird den gesamten Verlauf unseres Repositorys überschreiben, wobei der aktuelle Master als neuer Root committiert wird. Sie können das Neuschreiben abschließen, indem Sie die "Backup" -Referenzen in refs/original entfernen. Außerdem können Sie jetzt die Datei .git/shallow löschen.

Nachdem Sie dies getan haben, sollten Sie in der Lage sein, die jetzt ungepfropfte Geschichte in Ihrer neuen Fernbedienung zu schieben.

+0

Git-Version> 1.9.0 ermöglicht es, von einem flachen Klon zu drücken. Und es ist sehr praktisch, wenn Sie den vollständigen Verlauf auf einem Server speichern möchten, aber nur den Verlauf des letzten Jahres für einen anderen Computer benötigen. Die einzige Sache ist, ich denke, dass Sie git> 1.9.0 auf dem Klienten und dem Server haben müssen, um diese Eigenschaft zu verwenden. – jtorca

+0

Statt 'git rev-parse --verify master >> .git/info/grafts' habe ich zuerst den neuen Graft-Punkt ausgecheckt und dann die Commit-Referenz verwendet:' git rev-parse --verify 9133eece0 >> .git/Informationen/Transplantate. Ich habe dann den 'git filter-branch - --all' gemacht. Ich musste die Datei ".git/shallow" nicht entfernen, da sie bereits verschwunden war. Ich habe nicht ganz verstanden, wie man die "Backup" -Referenzen in "refs/original" löscht, und ich vermute, dass der gepfropfte Repo noch immer 68M groß war. Nachdem ich jedoch zum neuen Upstream-Repo gedrängt hatte, lokal geklont und das Ergebnis war ein 112K-Klon, was ich erwartet hatte – JinnKo

+1

@JinnKo Was ich meinte mit * Entfernen der "Backup" -Referenzen *, war buchstäblich eine 'rm -rf .git/refs/original' auszuführen.;) –

0

versuchen, etwas wie folgt aus:

mkdir -p /tmp/git-copy 
cd /tmp/git-copy 

# create another copy of your repository 
git clone file:///path/to/cloned/repo 

cd repo 
git rebase -i (first-commit) 

# in vim: 
# :2,$s/^pick/squash 
# :w 

# Now wait, it will take a while... 

git push --mirror [email protected]github.com:username/new-repo.git 

versuchte ich es gerade jetzt auf this repository. Scheint zu funktionieren - keine Geschichte und alle Submodule sind intakt.

+0

Nur Rebasing hat nicht für mich funktioniert die Verwendung des 'depth'-Arguments macht den Klon immer flach, und das ist es, wonach OP fragt, und auch meinen Anwendungsfall. Die richtige Antwort benötigt' filter- Verzweigung ", wie Zeeker sagt. –