2010-06-30 6 views
2

J'ai un référentiel que j'ai créé au début de la courbe d'apprentissage d'un projet. Comme j'ai appris plus, je me suis rendu compte que ceci crée des problèmes parce que certains des dossiers que je veux dépister ne sont pas exigés dans la source compilée. Ce que je voudrais faire est de créer un nouveau répertoire parent "projet", de déplacer le répertoire source existant dans ce répertoire parent et de migrer les fichiers qui n'ont pas besoin d'être compilés dans ce répertoire parent.Déplacement d'un répertoire .git

Est-ce possible avec git? Est-ce que je détruirai complètement toutes les références puisque je veux déplacer le répertoire .git/ jusqu'au niveau parent aussi?

Merci.

+0

Vous dites "déplacer le répertoire source existant dans ce répertoire parent et migrer les fichiers qui n'ont pas besoin d'être compilés dans ce répertoire parent". Lequel déménagez-vous? Et pourquoi cela ne peut-il pas être fait avec .gitignore et 'git rm --cached path/to/files'? – sargas

+1

Un peu comme http://stackoverflow.com/questions/3142419/how-can-i-move-a-directory-in-a-git-repo-for-all-commits (ce qui signifierait: pas besoin de bouger le répertoire .git)? – VonC

Répondre

3

Une option serait de simplement déplacer les choses dans votre dépôt actuel.

Par exemple, en supposant quelque chose comme:

/.git 
/lib/lib.c 
/lib/lib.h 
/test.c 
/readme.txt 

Vous pouvez créer un nouveau dossier (src ci-dessous) et déplacer le dossier lib et le dossier test.c dans la nouvelle (en utilisant git mv). Ensuite, le répertoire courant sera votre répertoire parent "projet" que vous voulez, et tout le code sera dans le nouveau dossier. Une alternative serait git filter-branch, comme l'a fait remarquer VonC dans les commentaires

/.git 
/src/lib/lib.c 
/src/lib/lib.h 
/src/test.c 
/readme.txt 
En utilisant ce que je crois que vous pourriez construire un référentiel restructuré qui n'aurait pas un engagement pour les mouvements, les fichiers auraient simplement toujours existé dans la nouvelle structure.

+0

J'ai fini par prendre cette approche simple et stupide après m'avoir maudit puissamment pour ne pas considérer la solution évidente. Merci, Chris. –

1

En accord avec Chris Shaffer, vous pouvez utiliser le script suivant pour accomplir ces étapes:

fullpath=`pwd` 
dirname=`basename $fullpath` 

if [ ! -d ./.git ]; then 
    echo 'Working directory contains no .git repository. There is nothing to move.' 
elif [ -d ../.git ]; then 
    echo 'Parent directory already contains a .git repository. Aborting.' 
elif [ -d $dirname ]; then 
    echo "There's already a $dirname directory. Aborting to be safe." 

else # Enough checking; let's get some work done... 

    mkdir $dirname 
    shopt -s extglob 
    for file in `ls -a | egrep -v [.]git\|^[.]+\$\|^$dirname\$`; do 
    git mv $file $dirname/ 
    done 
    mv .git* .. 
    mv $dirname/* . 
    mv html/.[a-z]* . 
    git commit -m "Moved Git repository up one directory" 
    rmdir $dirname 

fi 

Cela pourrait être un peu plus la vérification que nécessaire pour une situation unique, mais il faut faire la emploi. Vous pouvez l'adapter à la main ou l'enregistrer en tant que script exécutable, puis l'appeler depuis le répertoire contenant .git.

Apparemment, d'autres ont été en mesure de mv .git .., mais cela n'a pas fonctionné pour moi. Je dois d'abord effectuer toutes les opérations git mv file, puis tout remonter d'une unité.

Si je rends cela plus robuste à l'avenir, je publierai des mises à jour au https://github.com/jcamenisch/dotfiles/blob/master/bin/mv-git-up.

Questions connexes