2017-10-09 1 views
0

Ich habe mit Kommandos wie:git nicht mehr Geschichte neu zu schreiben

git filter-branch --index-filter \ 
      'git ls-files -s | sed "s_subdir/__" | 
        GIT_INDEX_FILE=$GIT_INDEX_FILE.new \ 
          git update-index --index-info && 
      mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD 

einen Verzeichnisbaum aus einem Unterverzeichnis „subdir“ auf die oberste Ebene zu bewegen. Um den Repo nach einem anderen und auch erfolgreichen Filterbaum aufzuräumen, ich habe versucht mit:

git filter-branch --tag-name-filter cat -- --all 
git filter-branch --commit-filter 'git_commit_non_empty_tree "[email protected]"' HEAD 
git reflog expire --all --expire=now 
git gc --prune=now --aggressive  

Dieser mischt ein paar Empfehlungen von hier herum. jedoch nach diesen Filter-Zweig nicht mehr tun funktioniert:

Rewrite 07436df7a2795910fb0b718d1a1b84e195cfabea (1/113) (0 seconds passed, remaining 0 predicted) mv: cannot stat ‘somepathhere/.git-rewrite/t/../index.new’: No such file or directory 
index filter failed: git ls-files -s | sed "_subdir/__" | 
GIT_INDEX_FILE=$GIT_INDEX_FILE.new \ 
git update-index --index-info && 
mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE" 

Ich bin bin nicht klar, warum diese oder die Befehle aufzuräumen des ‚Voodoo‘ sein sollte, habe ich dafür verantwortlich war. Offensichtlich fehlt etwas Wissen von meinem Git-Fu. Kann jemand vorschlagen, was das sein könnte?

+0

Hat Commit '07436df7a2795910fb0b718d1a1b84e195cfabea' das Unterverzeichnis write? –

+0

Der Befehl ist, den Inhalt des Repos von "Unterverzeichnis" in das Stammverzeichnis des Verzeichnisses zu verschieben. Das Root-Verzeichnis muss für jedes Commit vorhanden sein, wenn Sie das mit dem Unterverzeichnis "write" meinen. Ich glaube, das Unterverzeichnis existiert für alle Commits und ich habe mit --prune-empty umgeschrieben. Allerdings .git-rewrite existiert nicht und sollte natürlich auch nicht für irgendeinen commit sein. –

+0

Eigentlich habe ich irgendwie ein Homophon benutzt; Ich meinte das "richtige" Unterverzeichnis. Existiert 'subdir /' im Baum des Commits, das er erwähnt? Was bekommst du, wenn du zur Kasse gehst 07436df; ls? (Es gibt eine Möglichkeit, den Baum nur für einen Commit zu betrachten, aber ich erinnere mich nicht, was es ist und habe im Moment keinen 'Git') –

Antwort

1

Das Neuschreiben ist fehlgeschlagen, weil es mindestens eine Festschreibung gab, bei der "Unterverzeichnis" nicht existierte. Das Update, das funktioniert für mich ist, den Filter zu verändern erorrs zu ignorieren, indem Sie „;/bin/true

git filter-branch --index-filter \ 
      'git ls-files -s | sed "s_subdir/__" | 
        GIT_INDEX_FILE=$GIT_INDEX_FILE.new \ 
          git update-index --index-info && 
      mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"; /bin/true' HEAD 

Dies scheint das Äquivalent von --ignore-unmatch für zu sein - Index-Filter.

Ich bin noch nicht sicher, warum die leeren Commits durch die vorherige nicht entfernt wurden:

git filter-branch --prune-empty --tag-name-filter cat -- --all 
git filter-branch --commit-filter 'git_commit_non_empty_tree "[email protected]"' HEAD 

Allerdings gibt es eine Lösung für das ist (von diesem question):

git filter-branch --parent-filter "sed 's/-p <the_commit>//'" HEAD 

Das von der snips initial commit, das ist nur ein Kommentar ohne Dateien (als Ergebnis der früheren Neuschreiben). Sobald dies erledigt ist, wird der ";/bin/true" -Trick möglicherweise nicht mehr benötigt.

Verwandte Themen