Déplacer un dépôt git vers le haut d'un niveau hiérarchique

Git débutant question:

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

, j'ai eu ce jeu dans le répertoire du projet, c'est à dire dans "racine".

Maintenant, un deuxième répertoire a dû être créé, placé parallèlement à webroot. Appelons ça des actifs.

Donc la structure est maintenant la suivante:

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

J'aimerais inclure ce nouveau répertoire dans le Git repository, de sorte que je modifie également la version des fichiers stockés là-bas, mais bien sûr, je ne peux pas utiliser "git add ../actif". Je ne suis pas non plus enclin à créer un nouveau projet git dans project_directory, car cela perdrait tous mes commits précédents.

Alors, comment puis-je déplacer le référentiel hors de "webroot" dans "project_directory", tout en conservant mes commits et en pouvant inclure des "assets"?

61
demandé sur Sorcy 2011-03-23 19:26:07

5 réponses

Donc, vous voulez que votre repo git ressemble à ceci:

<projectdir>
    /.git
    /webroot
    /assets

Pour ce faire, vous devez déplacer les fichiers existants dans votre pension dans une nouvelle webroot sous-répertoire.

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 voulez déplacer votre clone d'un répertoire au-dessus où il se trouve maintenant:

cd <projectdir>
mv webroot/* .
rmdir webroot

Ensuite, vous voulez ajouter le répertoire assets (et les fichiers) au dépôt git:

git add assets
git commit -m "added assets to the repo"
60
répondu Tim Henigan 2011-03-26 13:22:46

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

La page de manuel git filter-branch a la réponse, ici une version améliorée qui réécrit toutes les refs (branches) et les tags existants:

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

Des précautions ont été prises pour faire de cette opération une opération d'index uniquement afin que le processus fonctionne rapidement même pour les gros repos. N'oubliez pas de (lorsqu'il est satisfait) se débarrasser de l'original refs (.git/refs/original/*) et remballer le repo pour perdre les objets arborescents obsolètes.

9
répondu sehe 2011-03-26 23:18:02

Vous pouvez également déplacer votre .git dir un niveau et mettre à jour votre worktree.

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 le noyau.worktree doit être absolu.

9
répondu braitsch 2011-10-27 23:23:41

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 revérifier le référentiel dans le nouvel emplacement "/ project directory " ajouter le répertoire assets et valider.

rm -Rf webroot
git clone path-to-repo
git add assets 
git commit -m "Added assets directory"
git push
5
répondu Nick 2011-03-23 16:34:28

La commande suivante réécrirait votre historique Git. Il semblerait comme si le contenu était dans webroot tout au long. Habituellement, la réécriture de l'historique est gênante si plusieurs personnes travaillent avec un repo. Puisque vous travaillez 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
répondu Lars Schneider 2018-02-10 16:25:17