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 --all
zeigt 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/master
gesamte damit verbundene Geschichte los?
quelle
Antworten:
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:
oder wenn Sie dies vielen Schiedsrichtern angetan haben und alles auslöschen möchten:
(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 --all
undgit gc --prune=now
ablaufen lassen und die jetzt nicht verwendeten Objekte löschen . (Warnung: vollständig, vollständig irreversibel. Seien Sie sehr sicher, bevor Sie es tun.)quelle
git update-ref -d refs/original/refs/heads/master
git update-ref -d original/refs/heads/master
? Allerdings hat nur Ihr zweiter Befehl für mich funktioniert.git update-ref -d refs/original/refs/heads/master
übrigens. Sie können den vollständigen Namen mit sehengit show-ref
.git show-ref refs/original/* --hash | xargs -n 1 git update-ref -d
?Und wenn Sie in Windows PowerShell sind:
quelle
filter-branch
Bewahrt 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:quelle