Angenommen, ich habe ein Repo, das diese Verzeichnisstruktur enthält:
repo/
blog/
_posts/
some-post.html
another-file.txt
Ich möchte zur _posts
obersten Ebene des Repos wechseln , damit die Struktur folgendermaßen aussieht:
repo/
_posts/
some-post.html
another-file.txt
Das ist einfach genug git mv
, aber ich möchte die Geschichte so aussehen lassen, als ob sie _posts
immer an der Wurzel des Repos existiert, und ich möchte in der Lage sein, die gesamte Geschichte von some-post.html
via abzurufen git log -- _posts/some-post.html
. Ich kann mir vorstellen, dass ich etwas Magie einsetzen kann git filter-branch
, um dies zu erreichen, aber ich habe nicht genau herausgefunden, wie das geht. Irgendwelche Ideen?
quelle
--index-filter
, da es den Baum nicht auschecken muss.git rm --cached
rm
git filter-branch --index-filter 'git read-tree --prefix=/ $GIT_COMMIT:_posts; git rm -r --cached _posts' -- --all
. Fügen Sie hinzu,--tag-name-filter cat
wenn Ihre Tags nicht signiert sind und Sie sie verschieben / die alten ungültig machen möchten.git push --force --all
alle Zweige. Andernfalls kann es zu lustigen Situationen kommen.Obwohl Ramkumars Antwort sehr hilfreich und wertvoll ist, wird sie in vielen Situationen nicht funktionieren. Zum Beispiel, wenn Sie ein Verzeichnis mit anderen Unterverzeichnissen an einen neuen Speicherort verschieben möchten.
Dazu enthält die Manpage den perfekten Befehl:
Ersetzen Sie einfach NEWSUBDIR durch Ihr gewünschtes neues Verzeichnis. Sie können auch verschachtelte Verzeichnisse wie dir1 / dir2 / dir3 / - "verwenden.
quelle
You need to run this command from the toplevel of the working tree
sed
Befehl? Ich versuche dies unter Windows und brauche eine Alternative.git ls-files -s | sed "s-\tdir1/dir2/dir3/-\t-"
git update-index
, wird die Datei "$ GIT_INDEX_FILE.new" nicht erstellt, und der Befehl mv schlägt fehl. Am Ende befand ich michtest -f \$GIT_INDEX_FILE.new && mv \$GIT_INDEX_FILE.new \$GIT_INDEX_FILE || touch \$GIT_INDEX_FILE
im Filter-Branch-Skript.Erstellt ein generisches Skript für beliebige Verschiebungen / Umbenennungen: https://gist.github.com/xkr47/f766f4082112c086af63ef8d378c4304
Beispiele:
➜ verschiebt alle Dateien in allen Commits des aktuellen Zweigs in ein Unterverzeichnis "subdir /"
➜ benennt foo / bar.txt in allen Commits des aktuellen Zweigs in foo / barbar.txt um
quelle