669 votes

Comment obtenir Git pour cloner dans le répertoire actuel

Je fais :

git clone ssh://user@host.com/home/user/private/repos/project_hub.git ./

Je reçois :

Fatal: le chemin de destination '.' existe déjà et n'est pas un répertoire vide.

Je sais que le chemin '.' existe déjà. Et je peux assurer que le répertoire EST vide. (Je fais ls à l'intérieur et je ne vois rien !)

Qu'est-ce que je manque ici pour cloner ce projet dans le répertoire actuel ?

19 votes

Si vous exécutez un ls -a, voyez-vous un répertoire .git ?

3 votes

@dtryon - Non. Mais je vois un DS_Store, quoi que cela soit. Peut-être devrais-je m'en débarrasser. Merci pour cela -a :s

0 votes

@Merci pour ta réponse rapide. James Maclaughlin, cela semble être une belle commande pour s'assurer que nous clonons dans un répertoire vide. :)

706voto

Roshan Pal Points 793

Il suffit de mettre un point à côté

git clone git@github.com:user/my-project.git .

De git help clone:

Le clonage dans un répertoire existant n'est autorisé que si le répertoire est vide.

Assurez-vous donc que le répertoire est vide (vérifiez avec ls -a), sinon la commande échouera.

19 votes

D'accord, notez que sur un Mac, un fichier .DS_Store créé automatiquement par Finder bloquera le clonage. Vérifiez avec ls -la

336 votes

Non. Ce n'est pas la bonne réponse. Cela retournerait toujours "fatal: le chemin de destination '.' existe déjà et n'est pas un répertoire vide."

18 votes

Fonctionne pour moi en utilisant git v1.8.3.2. @SidSarasvati Êtes-vous sûr que le répertoire actuel est vide?

418voto

Andre Holzner Points 6419

Le suivant n'est probablement pas entièrement équivalent à un clone dans tous les cas, mais a fonctionné pour moi :

git init .
git remote add -t \* -f origin 
git checkout master

Dans mon cas, cela produit un fichier .git/config qui est équivalent à celui que j'obtiens lors d'un clone.

47 votes

De plus, ceci est l'incantation qui permet de conserver le contenu actuel - disons si vous clônez vos fichiers de configuration dans votre répertoire personnel.

7 votes

Avec cela, je suis enfin autorisé à cloner dans le dossier de mon choix sans que Git ne me traite comme un bébé. Lorsque j'ai également ajouté un fichier .gitignore temporaire contenant * (ignorer tout), j'ai pu exécuter git checkout master même s'il y avait déjà d'autres fichiers dans le dossier. Ensuite, tous les fichiers validés du dépôt ont été clonés (et le fichier .gitignore temporaire a été écrasé par le .gitignore propre du dépôt). Tout a fonctionné à merveille. Cela devrait se faire automatiquement en utilisant git clone -f ou quelque chose de similaire.

1 votes

Si vous avez des fichiers qui sont différents/nouveaux/changés qui seront écrits par-dessus (... les fichiers seraient écrasés par le checkout ... Abandon) utilisez : git checkout master -f.

63voto

eckes Points 17277

Pour être sûr que vous pouvez cloner le dépôt, allez dans n'importe quel répertoire temporaire et clonez le projet là-bas :

git clone ssh://user@host.com/home/user/private/repos/project_hub.git

Cela clonera vos fichiers dans un répertoire project_hub.

Une fois le clonage terminé, vous pouvez déplacer ce répertoire où vous le souhaitez :

mv project_hub /path/to/new/location

Ceci est sûr et ne nécessite rien de particulier.

13 votes

Cela va créer un sous-répertoire dans le répertoire préexistant /chemin/vers/nouvel/emplacement qui n'est certainement pas le but de la question.

1 votes

Ensuite, vous devrez déplacer manuellement les fichiers cachés ou utiliser une commande compliquée... et cela ne répond pas à la question.

58voto

return1.at Points 980
git clone votre-dépôt tmp && mv tmp/.git . && rm -rf tmp && git reset --hard

1 votes

C'est une astuce :D

15voto

MEM Points 4592

La solution était d'utiliser le dot, donc:

rm -rf .* && git clone ssh://user@host.com/home/user/private/repos/project_hub.git .`

rm -rf .* && peut être omis si nous sommes absolument sûrs que le répertoire est vide.

Crédits à : @James McLaughlin dans les commentaires

12 votes

Cela semble maléfique, car .* inclut le répertoire parent! moi:~/tmp/tmp/tmp$ ls -d .* . .. moi:~/tmp/tmp/tmp$

1 votes

Cela ne m'aide pas, car j'ai des dépendances dans le répertoire où j'ai besoin de faire le checkout out.

25 votes

Je ne suis pas sûr que ce soit sage d'écrire rm -rf (sous n'importe quelle forme) dans une réponse SO sans un avertissement VRAIMENT EFFRAYANT. Un utilisateur inexpérimenté pourrait venir ici chercher le "check-mark vert" (généralement la meilleure réponse) puis copier-coller cette commande et pouf... tout son travail a été effacé dans le répertoire actuel. Au fait : rm -rf ./.* est "plus sûr" si vous ne supprimez que les fichiers et répertoires cachés (point) sous le répertoire actuel (comme l'a mentionné @stackunderflow avant moi). Mais rm -rf est une commande dangereuse pour les utilisateurs inexpérimentés donc faites attention ! Juste mon avis.

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