it-swarm.com.de

Verschieben eines Git-Repositorys um eine Hierarchieebene

Git Anfängerfrage:

Ich habe ein kleines privates Webprojekt, das lokal mit msysgit versioniert ist. Es gibt kein Exterieur-Repository, da es nur für mich ist, und ich kann bascially tun, was ich will.

Ich habe dies im Projektverzeichnis eingerichtet, dh in "webroot".

Nun musste ein zweites Verzeichnis erstellt werden, das parallel zu webroot platziert wurde. Nennen wir es Vermögenswerte.

So ist die Struktur nun wie folgt:

\ project directory
----\webroot
----\assets

Ich würde dieses neue Verzeichnis gerne in das git-Repository aufnehmen, sodass ich auch Versionsänderungen in den dort gespeicherten Dateien vornehmen würde. Natürlich kann ich "git add ../assets" nicht verwenden. Ich bin auch nicht geneigt, ein neues git-Projekt in project_directory zu erstellen, da dies meine vorherigen Commits verlieren würde.

Wie kann ich also das Repository aus "webroot" in "project_directory" nach oben verschieben, dabei meine Commits beibehalten und dann "assets" hinzufügen können?

61
Sorcy

Sie möchten, dass Ihr Git-Repo so aussieht:

<projectdir>
    /.git
    /webroot
    /assets

Dazu müssen Sie die vorhandenen Dateien in Ihrem Repo in ein neues webroot-Unterverzeichnis verschieben.

cd <git repo root>
mkdir webroot
git mv <all your files> webroot
git commit --all -m "moved all existing files to new 'webroot' directory"

Dann möchten Sie in Ihrem lokalen Dateisystem Ihren Klon um ein Verzeichnis über dem aktuellen Verzeichnis verschieben:

cd <projectdir>
mv webroot/* .
rmdir webroot

Dann möchten Sie das assets-Verzeichnis (und die Dateien) zum git-Repo hinzufügen:

git add assets
git commit -m "added assets to the repo"
62
Tim Henigan

Sie können auch Ihr .git-Verzeichnis um eine Stufe nach oben verschieben und Ihren Arbeitsbaum aktualisieren.

cd projectdir
mv ./webroot/.git ./.git
git config core.worktree /absolute-path-to-project-dir
git add assets
git commit -m 'adding assets folder'

Nicht positiv, aber ich bin mir ziemlich sicher, dass der Weg zu core.worktree absolut sein muss.

11
braitsch

Ich nehme an, Sie wollten die Historie so umschreiben, dass sie alle Dateien in allen Revisionen enthält als ob sie immer in einem Unterverzeichnis webroot/statt im Stammverzeichnis gewesen wären

Die git filter-branch-Manpage hat die Antwort, hier eine verbesserte Version, die alle vorhandenen Refs (Zweige) und Tags neu schreibt:

time git filter-branch --index-filter 'git ls-files -s |
         sed "s-\t\"*-&webroot/-" |
         GIT_INDEX_FILE=$GIT_INDEX_FILE.new git update-index --index-info && 
     mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' --tag-name-filter cat -- --all

Es wurde sorgfältig darauf geachtet, dass dies ein Index-Only-Vorgang ist, sodass der Prozess selbst bei großen Repos schnell ablaufen kann. Denken Sie daran (wenn Sie zufrieden sind), die ursprünglichen Refs (.git/refs/original/*) loszuwerden und das Repo erneut zu packen, um die veralteten Baumobjekte zu verlieren.

9
sehe

Ihre Commits sind nicht lokal an den Ordner "webroot" gebunden, da sie im git repo gespeichert sind.

Sie können einfach das Webroot-Verzeichnis entfernen, um das Repository im neuen Verzeichnis "/ Projektverzeichnis" zu überprüfen, das Assets-Verzeichnis hinzuzufügen und zu bestätigen.

rm -Rf webroot
git clone path-to-repo
git add assets 
git commit -m "Added assets directory"
git Push
5
Nick

Der folgende Befehl würde Ihre Git-Historie neu schreiben. Es sieht so aus, als wäre der Inhalt die ganze Zeit in webroot. Normalerweise ist das Umschreiben des Verlaufs problematisch, wenn mehrere Personen mit einem Repo arbeiten. Da Sie alleine daran arbeiten, sollte es in Ordnung sein.

git filter-branch --index-filter '
    git read-tree --prefix="webroot/" $GIT_COMMIT && \
    git ls-files \
      | sed "s/\/.*//" \
      | sort \
      | uniq \
      | grep -v "^webroot" \
      | xargs -L1 git rm -r --cached > /dev/null'
0
Lars Schneider