Wie kann man ein Seed / Kick-Start-Projekt ohne die gesamte Geschichte klonen?

74

Beachten Sie, dass die Verwendung von --depth=1Parametern verhindert, dass Sie das Projekt in ein neues Repository verschieben .

Details finden Sie unter: "Remote abgelehnt" (flache Aktualisierung nicht zulässig) nach dem Ändern der Git-Remote-URL

itamar
quelle
Ja, was ist mit --depth=Nstatt 1? "Flaches Update" wird immer noch abgelehnt und tut es einfach rm -r .gitund git initwird es nicht schneiden. Ich werde die ganze "Unpfropf" -Magie ausprobieren, und wenn sie für den allgemeinen Fall (Tiefe N) funktioniert, sollte sie die akzeptierte (und am besten bewertete;)) Antwort sein.
Tomasz Gandor

Antworten:

63

Sie können eine tun

git clone <git_url>

Löschen Sie das .git-Repository aus Ihrem Ordner. Dadurch wird Ihr gesamter Verlauf gelöscht.

Das kannst du machen

git init 

Dadurch wird ein völlig neues Git-Projekt für Sie erstellt.

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

Ajay
quelle
8
Es werden höchstwahrscheinlich alle Submodule entfernt.
Aleksander Alekseev
@AleksanderAlekseev Von welchen Submodulen sprichst du?
Willa
Wenn Sie den Verlauf nicht benötigen, ist dies die einfachste Lösung.
Willa
2
@Willa Kann ich weiterhin Updates im Upstream-Projekt in mein Projekt einbinden, wenn ich diesen Weg gehe?
Felipe
1
Ich bin nicht sicher, ob ich Ihre Frage @FelipeAlmeida verstehe. In jedem Fall ist diese Vorgehensweise so, als hätten Sie ein völlig neues Git-Projekt mit vorhandener Quelle erstellt. Was auch immer Sie mit einem neuen Projekt tun können, sollte möglich sein, wenn Sie diesem Weg folgen.
Willa
30

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


Ein flacher Klon gibt vor, die gesamte Historie zu haben, indem er einen sogenannten Transplantationspunkt verwendet , um das Elternteil des "ersten" Commits zu fälschen. Wenn wir davon ausgehen, dass wir den vollständigen Verlauf zur Verfügung haben, könnten wir die Frage umformulieren: Wie kann ich den Verlauf vor einer bestimmten Überarbeitung wegwerfen?

Dies bedeutet, dass wir eine Kombination aus einem Transplantationspunkt und git filter-branch(wie in der verknüpften Frage vorgeschlagen) verwenden können. Sie müssen jedoch beachten, dass dadurch Ihr vollständiger Verlauf neu geschrieben wird und der neue nicht mit der Fernbedienung kompatibel ist, 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 mit dem Umschreiben beginnen. Nehmen wir an, wir möchten, dass der aktuelle Master den neuen Stamm für das Repository festschreibt.

git rev-parse --verify master >> .git/info/grafts
git filter-branch -- --all

Dadurch wird der gesamte Verlauf unseres Repositorys mit dem aktuellen Master-Commit als neuem Stamm neu geschrieben. Sie können das Umschreiben abschließen, indem Sie die "Backup" -Referenzen in entfernen refs/original. Außerdem können Sie jetzt die .git/shallowDatei löschen .

Nachdem Sie dies getan haben, sollten Sie in der Lage sein, den jetzt nicht gepfropften Verlauf in Ihre neue Fernbedienung zu übertragen.

Sascha Wolf
quelle
2
Git-Version> 1.9.0 ermöglicht das Pushing von einem flachen Klon. 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. Das einzige ist, ich denke, Sie müssen Git> 1.9.0 sowohl auf dem Client als auch auf dem Server haben, um diese Funktion nutzen zu können.
Jtorca
Stattdessen habe git rev-parse --verify master >> .git/info/graftsich zuerst den neuen Transplantationspunkt ausgecheckt und dann die Festschreibungsreferenz verwendet : git rev-parse --verify 9133eece0 >> .git/info/grafts. Ich habe dann das gemacht git filter-branch -- --all. Ich musste die .git/shallowDatei nicht entfernen , da sie bereits verschwunden war. refs/originalIch habe nicht ganz verstanden, wie man die "Backup" -Referenzen in "entfernt, und ich vermute, dies ist der Grund, warum das gepfropfte Repo immer noch 68 Millionen groß war. Nachdem ich jedoch auf das neue Upstream-Repo umgestiegen bin, habe ich es lokal neu geklont und das Ergebnis war ein 112K-Klon, was ich erwartet hatte.
JinnKo
1
@JinnKo Was ich mit dem Entfernen der "Backup" -Referenzen meinte , war buchstäblich a auszuführen rm -rf .git/refs/original. ;)
Sascha Wolf
2
Refs können in verschiedenen Formen existieren. Der sichere Weg, eine Referenz zu entfernen, ist zB git update-ref -d refs/original/master(eigentlich ich normalerweise, git push . :refs/blahweil ich einmal nicht über Update-Ref wusste). Eine ausführlichere Erklärung finden Sie in dieser Antwort auf "So löschen Sie den alten Verlauf" .
Clacke
1

Versuchen Sie so etwas:

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]:username/new-repo.git

Ich habe es gerade in diesem Repository versucht . Scheint zu funktionieren - keine Historie und alle Submodule sind intakt.

Aleksander Alekseev
quelle
1
Nur das erneute Basieren hat bei mir nicht funktioniert, da die Verwendung von depthArgumenten den Klon immer flach macht, und das ist es, was OP verlangt, und auch mein Anwendungsfall. Die richtige Antwort braucht, filter-branchwie Zeeker sagt.
Jesús Franco
`: 2, $ s / ^ pick / squash` Dies ist ein vim-Befehl oder ist der Text, den wir oben hinzufügen sollten? Können Sie bitte erklären, was dies bewirkt?
Arnold Roa
@ArnoldRoa Dies ist ein VIM-Befehl, der alle "pick" durch "squash" in der VIM-Datei ersetzt (ab der 2. Zeile).
user2528260