web-dev-qa-db-fra.com

Déplacement d'un référentiel git vers le haut d'un niveau hiérarchique

Git débutant question:

J'ai un petit projet Web privé qui est versionné localement avec msysgit. Il n'y a pas de référentiel extérieur, car ce n'est que pour moi, je peux donc faire ce que je veux.

Je l'ai eu mis en place dans le répertoire du projet, c'est-à-dire dans "webroot".

Maintenant, un second répertoire devait être créé, placé parallèlement à webroot. Appelons cela des atouts.

Donc, la structure est maintenant comme suit:

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

J'adorerais inclure ce nouveau répertoire dans le référentiel git, de sorte que les modifications apportées aux versions des fichiers stockés y soient également, mais je ne peux bien sûr pas utiliser "git add ../assets". Je ne suis pas non plus enclin à créer un nouveau projet git dans répertoire_projet, car tous les commits précédents seraient perdus.

Alors, comment puis-je déplacer le référentiel de "racine Web" vers le "répertoire_projet", tout en conservant mes commits et en pouvant ensuite inclure des "actifs"?

61
Sorcy

Donc, vous voulez que votre dépôt git ressemble à ceci:

<projectdir>
    /.git
    /webroot
    /assets

Pour ce faire, vous devez déplacer les fichiers existants de votre référentiel dans un nouveau sous-répertoire webroot.

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

Ensuite, sur votre système de fichiers local, vous souhaitez déplacer votre répertoire dupliqué ci-dessus où il se trouve maintenant:

cd <projectdir>
mv webroot/* .
rmdir webroot

Ensuite, vous souhaitez ajouter le répertoire assets (et les fichiers) au référentiel git:

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

Vous pouvez également déplacer votre répertoire .git d’un niveau et mettre à jour votre arbre de travail.

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

Pas positif, mais je suis sûr que le chemin vers core.worktree doit être absolu.

11
braitsch

Je suppose que vous vouliez réécrire l'historique pour qu'il contienne tous les fichiers de toutes les révisions comme s'ils avaient toujours été dans un sous-répertoire webroot/plutôt que dans la racine

La page de manuel git filter-branch a la réponse, voici une version améliorée qui réécrit toutes les références (branches) et balises existantes:

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

Nous avons pris soin de faire de cette opération une opération d'index uniquement afin que le processus s'exécute rapidement, même pour les gros dépôts. N'oubliez pas (lorsque vous êtes satisfait) de vous débarrasser des références d'origine (.git/refs/original/*) et de remballer le repo pour supprimer les objets d'arbre obsolètes.

9
sehe

Vos commits ne sont pas liés localement au dossier "webroot", ils sont stockés dans le dépôt Git.

Vous pouvez simplement supprimer le répertoire webroot et revérifier le référentiel dans le nouvel emplacement "/ répertoire du projet", ajouter le répertoire des ressources et valider.

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

La commande suivante réécrirait votre historique Git. Il semblerait que le contenu soit dans webroot tout au long. Habituellement, l’historique de réécriture est gênant si plusieurs personnes travaillent avec un référentiel. Puisque tu travailles seul dessus, ça devrait aller.

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