623 votes

Git : Quelle est la meilleure pratique pour "cloner git" dans un dossier existant ?

J'ai une copie de travail du projet, sans aucune méta-donnée de contrôle de source. Maintenant, j'aimerais faire l'équivalent d'un git-clone dans ce dossier, et conserver mes modifications locales.

git-clone ne me permet pas de cloner dans un dossier existant. Quelle est la meilleure pratique ici ?

4 votes

Une meilleure discussion est aquí .

0 votes

Veuillez me conseiller : Ne serait-il pas plus simple, dans ce cas, de : a) copier coller la structure dans un dossier temporaire. b) faire git init sur le dossier vide souhaité. c) copier le contenu dans ce dossier, et faire git add . ?

1 votes

@MEM Je préfère cette réponse, mais l'une ou l'autre fonctionne... stackoverflow.com/a/5377989/11236

726voto

amicitas Points 1925

Cela peut être fait en clonant vers un nouveau répertoire, puis en déplaçant le fichier .git dans votre répertoire existant.

Si votre répertoire existant est nommé "code".

git clone https://myrepo.com/git.git temp
mv temp/.git code/.git
rm -rf temp

Cela peut également être fait sans faire de checkout pendant la commande clone ; plus d'informations peuvent être trouvées aquí .

49 votes

Notez que c'est exactement la suggestion de @ChrisJohnsen qu'il a laissée dans les commentaires. Je l'ai trouvée utile et j'ai voulu en faire une réponse réelle. Chris, si vous finissez par mettre en place une réponse, je serai heureux de supprimer celle-ci.

2 votes

Merci ! Mais il manque une étape comme "git checkout -- ." car il pense que tous les fichiers sont supprimés, non ?

2 votes

Non, tant que vous utilisez git clone comme première commande, aucune autre commande de vérification n'est nécessaire. Si vous utilisez plutôt quelque chose comme git clone --no-checkout dans cette première étape, puis après avoir déplacé le répertoire .git, il sera nécessaire d'utiliser git reset HEAD pour indiquer à git que les fichiers n'ont pas été supprimés.

367voto

Andreas Krey Points 1109

Ne clonez pas, récupérez plutôt. Dans le repo :

git init
git remote add origin $url_of_clone_source
git fetch origin
git checkout -b master --track origin/master # origin/master is clone's default

Ensuite, vous pouvez réinitialiser l'arbre pour obtenir l'engagement que vous souhaitez :

git reset origin/master # or whatever commit you think is proper...

et vous êtes comme cloné.

La question intéressante ici (et celle sans réponse) : Comment savoir sur quel commit votre arbre nu était basé, donc à quelle position revenir.

8 votes

Je ne suis pas un fan de cela - selon la configuration de github "Tip : The credential helper only works when you clone an HTTPS repository URL". J'utilisais l'aide à la crédentialité et cela m'a envoyé dans un long trou de lapin assez infructueux.

6 votes

'git checkout --track origin/master' fonctionne également bien à la place de 'git checkout -b master --track origin/master'. La réinitialisation n'est pas nécessaire.

2 votes

Je recevais l'erreur "Git error : The following untracked working tree files would be overwritten by checkout", alors j'ai ajouté cette commande : git clean -d -fx ""

47voto

user1055643 Points 323

L'utilisation d'un répertoire temporaire est acceptable, mais ceci fonctionnera si vous voulez éviter cette étape. Depuis la racine de votre répertoire de travail :

$ rm -fr .git
$ git init
$ git remote add origin your-git-url
$ git fetch
$ git reset --mixed origin/master

26 votes

git reset --hard origin/master supprimera tous les fichiers locaux.

2 votes

Pour ajouter à ce qui a déjà été souligné ci-dessus, la différence entre hard y mixed est que Mixed conservera les modifications locales (ainsi, si vous essayez plus tard de tirer, il vous montrera par exemple Impossible de tirer avec rebase : Vous avez des changements non indexés. Veuillez les commiter ou les mettre en cache. ), tandis que hard rejettera ces changements locaux

0 votes

Vous avez mal orthographié "remote".

42voto

jhwist Points 5270

Je git clone vers un nouveau répertoire et copier le contenu du répertoire existant vers le nouveau clone.

4 votes

Si vous faites cela, assurez-vous de revoir le diff avant de valider très attentivement - c'est un cas classique absolu où vous pouvez accidentellement revenir sur des changements qui ont été faits dans le repo source depuis que vous avez obtenu votre copie de travail - parce qu'il n'y a pas assez d'informations dans la copie de travail pour déterminer quels sont les changements que vous avez faits par rapport à ce qu'il était avant que vous ne commenciez à faire des changements, pour fusionner avec d'autres changements faits dans le repo. J'ai vu cela se produire maintes et maintes fois dans cette situation, au point que j'ai "fortement découragé" moi-même et les personnes avec qui je travaillais de le faire.

77 votes

git clone wherever tmp && git mv tmp/.git . && rm -rf tmp En d'autres termes, le déplacement de la .git Le nettoyage d'un clone temporaire semble plus simple que de nettoyer l'arbre de travail du clone et d'y copier les fichiers existants.

1 votes

@ChrisJohnsen : vous auriez dû en faire une réponse, c'est certainement la meilleure façon de le faire, à mon avis.

12voto

return1.at Points 980
git clone your_repo tmp && mv tmp/.git . && rm -rf tmp && git reset --mixed

7 votes

Utilisation de git reset --hard annulera les changements de fichiers locaux, ce qui n'est PAS ce que le PO a demandé. --mixed doit être utilisé à la place.

0 votes

--mixed peut être omis puisqu'il s'agit de la valeur par défaut.

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