83 votes

Déplacer un référentiel git d'un niveau de hiérarchie

Git question de débutant:

J'ai une petite salle de webproject qui est versionné localement avec msysgit. Il n'y a pas d'extérieur, espace de stockage, comme c'est seulement pour moi, afin que je puisse bascially 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 devait être créé, placée parallèlement à la racine de votre site. Appelons ça de l'actif.

Si la structure est maintenant comme suit:

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

J'aimerais inclure ce nouveau répertoire dans le répertoire git, alors que j'avais aussi des changements de version pour les fichiers qui y sont stockés, mais bien sûr je ne peux pas utiliser "git add ../actifs". Je ne suis enclin à créer un nouveau projet git dans project_directory, ce qui permettrait de perdre tous mes précédents s'engage.

Alors, comment dois-je aller sur le déplacement du référentiel de "racine" en "project_directory", tout en gardant ma s'engage et puis d'être en mesure d'inclure les "actifs"?

79voto

Tim Henigan Points 19948

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 clone un répertoire au-dessus de l'endroit 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"
 

19voto

braitsch Points 3353

Vous pouvez également simplement 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 presque sûr que le chemin vers core.worktree doit être absolu.

12voto

sehe Points 123151

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

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

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

Le soin a été pris pour faire ce un indice de la seule opération, de sorte que le processus est exécuté rapide, même pour les gros titres. N'oubliez pas de (lorsque vous êtes satisfait) de se débarrasser de l'original refs (.git/refs/original/*) et de remballer les pensions de perdre la désuet des objets de l'arborescence.

5voto

Nickolas Whiting Points 249

Vos validations ne sont pas liées localement au dossier "webroot", elles sont stockées dans le dépôt git.

Vous pouvez simplement supprimer le répertoire webroot recontrôler le référentiel dans le nouvel emplacement "/ répertoire de projet" ajouter le répertoire des actifs et valider.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X