Kopieren Sie ein Git-Repo ohne Verlauf

199

Ich habe derzeit ein privates Repository auf Github, das ich veröffentlichen möchte. Einige der anfänglichen Commits enthalten jedoch Informationen, die ich nicht veröffentlichen möchte (fest codierte Crentials usw.).

Was ist der einfachste Weg, um das neueste Commit öffentlich zu machen (ich brauche oder möchte die vorherigen Commits nicht wirklich im öffentlichen Repository), ohne einen Teil oder den gesamten Commit-Verlauf einzubeziehen?

Rafe
quelle
Warum erstellen Sie nicht einfach ein neues Repository?
Stephan
2
@Stephan Es geht mir gut, ein neues Repository zu erstellen, aber wie kann ich den neuesten Status aus dem alten Repository entfernen und ihn in das neue übernehmen?
Rafe
19
Sie können einfach den .git-Ordner löschen und erneut einen git-Init in dem Ordner
Stephan
2
Wenn Sie den .git-Ordner löschen, werden Ihre beiden Repositores inkompatibel. Sie können nicht von einem zum anderen zusammengeführt werden
Arnold Roa,
Kannst du es nicht wieder aufbauen? Sie quetschen buchstäblich nur alle alten Commits und drücken dann (erzwingen).
Xaxxon

Antworten:

320

Sie können die Tiefe des Verlaufs beim Klonen begrenzen :

--depth <depth>
Create a shallow clone with a history truncated to the specified 
number of revisions.

Verwenden Sie diese Option, wenn Sie einen begrenzten Verlauf wünschen, aber noch einige.

Gauthier
quelle
40
Geben Sie diesem Mann einen Keks (in Form der richtigen Markierung dieser Antwort) :)
FateNuller
7
Dies bezieht sich nicht auf die beabsichtigte Verwendung, die durch die Frage impliziert wird, die in ein entferntes öffentliches Repository übertragen werden soll. Der Versuch, einen flachen Klon zu pushen, führt dazu shallow update not allowed.
Brad Knox
277

Verwenden Sie den folgenden Befehl:

git clone --depth <depth> -b <branch> <repo_url>

Wo:

  • depthist die Anzahl der Commits, die Sie einschließen möchten. dh wenn Sie nur die neueste Commit-Verwendung wünschengit clone --depth 1
  • branchist der Name des Remote-Zweigs, von dem Sie klonen möchten. dh wenn Sie die letzten 3 Commits von der masterZweigverwendung verwenden möchtengit clone --depth 3 -b master
  • repo_url ist die URL Ihres Repositorys
Agam Rafaeli
quelle
7
Dies ist eigentlich die gleiche Antwort wie Gautier, aber vollständiger und mit einem Beispiel.
Aled
3
Tatsächlich ist es. Manchmal ist das Beispiel das, was benötigt wird. Für mich hat das Aufschreiben das Problem geklärt
Agam Rafaeli
3
+1 auf die Hauptantwort, aber auch auf diese, um zu erklären, auf welchen Zweig Sie die Tiefe anwenden möchten - ich weiß, dass dies Teil des Klonbefehls ist -, aber es verbindet alles in meinem einfachen Kopf gut miteinander ... und ich mag einfach
:)
7
Wie beantwortet dies die Frage? Alles was dies tut ist, einen flachen Klon lokal zu erstellen, aber was dann? Wie kopiert man diese lokale Kopie mit begrenztem Verlauf in ein neues Repo?
BradDaBug
4
@BradDaBug bringt einen gültigen Punkt. Ich habe die obigen Anweisungen befolgt und die Tiefe auf 1 begrenzt, dann den Remote-Ursprung geändert und dann versucht, auf mein neues Repo zu pushen. Ich habe jedoch eine Fehlermeldung erhalten shallow update not allowed. Ich fand diese Stapelüberlaufantwort in diesem Fall nützlich.
Craig Myles
18

Das Löschen des .gitOrdners ist wahrscheinlich der einfachste Weg, da Sie den Verlauf nicht wollen / brauchen (wie Stephan sagte).

So können Sie aus Ihrem letzten Commit ein neues Repo erstellen: ( Wie klone ich ein Seed / Kick-Start-Projekt ohne die gesamte Historie? )

git clone <git_url>

dann löschen .gitund anschließend ausführen

git init

Oder wenn Sie Ihr aktuelles Repo wiederverwenden möchten : Machen Sie das aktuelle Commit zum einzigen (anfänglichen) Commit in einem Git-Repository?

Befolgen Sie dann die obigen Schritte:

git add .
git commit -m "Initial commit"

Schieben Sie zu Ihrem Repo.

git remote add origin <github-uri>
git push -u --force origin master
JW
quelle
6
#!/bin/bash
set -e

# Settings
user=xxx
pass=xxx
dir=xxx
repo_src=xxx
repo_trg=xxx
src_branch=xxx

repo_base_url=https://$user:[email protected]/$user
repo_src_url=$repo_base_url/$repo_src.git
repo_trg_url=$repo_base_url/$repo_trg.git

echo "Clone Source..."
git clone --depth 1 -b $src_branch $repo_src_url $dir

echo "CD"
cd ./$dir

echo "Remove GIT"
rm -rf .git

echo "Init GIT"
git init
git add .
git commit -m "Initial Commit"
git remote add origin $repo_trg_url

echo "Push..."
git push -u origin master
timo kranz
quelle
2
das --depth 1ist in diesem Fall nicht notwendig , weil die Geschichte auch mit gelöschtrm -rf .git
rayphi
3
Ich denke, ich würde es so machen:git clone --depth 1 -b $src_branch $repo_src_url $dir && cd ./$dir && git commit --amend --author "Some One <[email protected]>" -m "Initial Commit" && git remote set-url origin $repo_trg_url && git push -u origin master
Rayphi
11
@rayphi ja das --depth 1ist unnötig, aber es ist auch harmlos und es spart ein wenig Netzwerkbandbreite (es macht keinen Sinn, einen Verlauf abzurufen , den Sie sowieso löschen möchten)
Silas S. Brown
1
Ich empfehle dies nicht, wenn Sie Ihre Repositorys kompatibel halten möchten.
Arnold Roa
Wenn Sie .git entfernen, entfernen Sie auch alle Git-Haken.
JudaPriest
0

Ist das nicht genau das, was das Quetschen einer Rebase bewirkt? Zerdrücke einfach alles außer dem letzten Commit und drücke es dann (erzwinge).

xaxxon
quelle