Refs / original / Heads / Master aus Git Repo entfernen nach Filter-Branch - Baum-Filter?

180

Ich hatte die gleiche Frage wie hier gestellt: Neues Git-Repository im Stammverzeichnis, um ein vorhandenes Repository in einem Unterverzeichnis zu subsumieren

Ich folgte dieser Antwort hier: Neues Git-Repository im Stammverzeichnis, um ein vorhandenes Repository in einem Unterverzeichnis zu subsumieren

Nun gitk --allzeigt zwei Geschichten: eine, die in der Strömung gipfeltmaster , und eine mit Namen original/refs/heads/master.

Ich weiß nicht, was diese zweite Geschichte ist oder wie ich sie aus dem Repo entfernen kann. Ich benötige keine zwei Historien in meinem Repository.

Wie werde ich es los?

Um sich selbst zu reproduzieren:

mkdir -p project-root/path/to/module
cd project-root/path/to/module
mkdir dir1 dir2 dir3 
for dir in * ; do touch $dir/source-file-$dir.py ; done
git init
git add .
git commit -m 'Initial commit'

Jetzt haben wir das Problem des Originalplakats. Verschieben wir die Wurzel des Git-Repos mit der oben verlinkten Antwort nach Projekt-Wurzel:

git filter-branch --tree-filter 'mkdir -p path/to/module ; git mv dir1 dir2 dir3 path/to/module' HEAD
rm -rf path
cd ../../../ # Now PWD is project-root
mv path/to/module/.git .
git reset --hard

Sehen Sie sich jetzt mein aktuelles Problem an:

gitk --all &
git show-ref

Wie werde ich die refs/original/heads/mastergesamte damit verbundene Geschichte los?

goofeedude
quelle

Antworten:

319

refs/original/*gibt es als Backup, falls Sie Ihren Filterzweig durcheinander bringen. Glauben Sie mir, es ist eine wirklich gute Idee.

Sobald Sie die Ergebnisse überprüft haben und sehr sicher sind, dass Sie das haben, was Sie wollen, können Sie die gesicherte Referenz entfernen:

git update-ref -d refs/original/refs/heads/master

oder wenn Sie dies vielen Schiedsrichtern angetan haben und alles auslöschen möchten:

git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d

(Das stammt direkt aus der Filter-Zweig-Manpage.)

Dies gilt nicht für Sie, sondern für andere, die dies möglicherweise finden: Wenn Sie einen Filterzweig ausführen, der Inhalte entfernt , die erheblichen Speicherplatz beanspruchen, möchten Sie möglicherweise auch Ihre Reflogs ausführen git reflog expire --expire=now --allund git gc --prune=nowablaufen lassen und die jetzt nicht verwendeten Objekte löschen . (Warnung: vollständig, vollständig irreversibel. Seien Sie sehr sicher, bevor Sie es tun.)

Cascabel
quelle
Update-ref Nachdem ich, reflog verfallen und gc, diese beiden Dateien verweisen noch die ursprüngliche ref: .git / info / refs und .git / gepackte-Refs Sieht aus wie vielleicht sollte sagen , dass diese statt:git update-ref -d refs/original/refs/heads/master
lhunath
1
Ich denke, Sie haben versehentlich die Worte gemischt: Wenn ich recht habe, sollte es sein git update-ref -d original/refs/heads/master? Allerdings hat nur Ihr zweiter Befehl für mich funktioniert.
JJD
4
Es ist git update-ref -d refs/original/refs/heads/masterübrigens. Sie können den vollständigen Namen mit sehen git show-ref.
stupsen
4
Was ist mit dem kürzeren git show-ref refs/original/* --hash | xargs -n 1 git update-ref -d?
CharlesB
11

Und wenn Sie in Windows PowerShell sind:

git for-each-ref --format="%(refname)" refs/original/ | foreach-object -process { git update-ref -d $_ }
Guilherme Duarte
quelle
6

filter-branchBewahrt Backups auf, sodass das Repository Reflogs bereinigen und Müll sammeln muss. Stellen Sie sicher, dass diese Sicherungen vor dem Löschen nicht erforderlich sind:

rm -Rf .git/refs/original
git gc --aggressive --prune=now
Kiryl Plyashkevich
quelle