Comment faire pour cloner Git dans le répertoire courant

500

Je fais:

git clone ssh://[email protected]/home/user/private/repos/project_hub.git ./

Je suis en train:

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

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

Qu'est-ce qui me manque ici pour cloner ce projet dans le répertoire courant?

MEM
la source
16
si vous faites un ls -a, voyez-vous un .gitrépertoire?
Davin Tryon
2
@dtryon - Non. Mais je vois un DS_Store quoi que ce soit. Je devrais peut-être m'en débarrasser. Merci pour cela -a: s
MEM
@Merci quatre votre réponse rapide. James Maclaughlin qui semble une belle commande pour s'assurer que nous clonons dans un répertoire vide. :)
MEM
1
Je suppose que vous êtes sur Mac . Est-ce que cela aide: stackoverflow.com/questions/107701/…
Davin Tryon
Pour ce que ça vaut, tous les dossiers que vous parcourez sur un Mac auront ces petits fichiers créés là. C'est très ennuyeux pour les utilisateurs Windows qui utilisent les mêmes partages et pour tout système (par exemple, git) qui a besoin que les dossiers soient vides ou effectue des actions par programme sur chaque fichier d'un dossier.
jsims281

Réponses:

510

mettez simplement un point à côté

git clone [email protected]: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.

Roshan Pal
la source
18
d'accord, notez que sur un mac, un fichier .DS_Store créé automatiquement par le finder bloquera le clone. vérifier avecls -la
ptim
281
Nan. Ce n'est pas la bonne réponse. Cela retournerait toujours "fatal: chemin de destination '.' existe déjà et n'est pas un répertoire vide. "
Sid Sarasvati
16
Fonctionne pour moi en utilisant git v1.8.3.2. @SidSarasvati Êtes-vous sûr que le répertoire actuel est vide ?
Wesley Baugh
3
@SidSarasvati pour moi, le directoy n'est pas vide, mais je m'en fous donc je ne sais pas pourquoi Git le ferait. Pourquoi ne peut-il pas cloner Git dans un répertoire non vide? Sûrement fonctionnel, ce n'est qu'un téléchargement de base.
Nathan Hornby
3
mkdircrée des liens physiques vers .et ..par défaut, un nouveau répertoire est-il techniquement "vide" dans les systèmes basés sur Unix? Je veux dire, je suppose que vous pourriez unlink .et unlink ..mais cela pourrait vous causer d'énormes problèmes plus tard si vous oubliez de vous
reconnecter à
351

Ce qui suit n'est probablement pas entièrement équivalent à un clone dans tous les cas, mais a fait l'affaire pour moi:

git init .
git remote add -t \* -f origin <repository-url>
git checkout master

Dans mon cas, cela produit un .git/configfichier qui est équivalent à celui que j'obtiens en faisant un clone.

Andre Holzner
la source
40
De plus, c'est l'incantation qui permet au contenu actuel de rester - par exemple, si vous clonez vos fichiers dot dans votre répertoire personnel.
rbellamy
7
Avec cela, je suis enfin autorisé à cloner dans le dossier que j'aime sans que Git me traite comme un bébé. Lorsque j'ai également ajouté un .gitignore temporaire contenant *(tout ignorer), je pouvais effectuer git checkout mastermême s'il y avait déjà d'autres fichiers dans le dossier. Ensuite, tous les fichiers validés du référentiel ont été clonés (et le .gitignore temporaire a été remplacé par le .gitignore approprié du référentiel). Tout a fonctionné à merveille. Cela devrait se produire de cette façon par lui-même en utilisant git clone -fou quelque chose.
PaulMag
1
si vous avez des fichiers différents / nouveaux / modifiés qui seront écrasés (... les fichiers seront écrasés par le paiement ... Abandon) utilisez: git checkout master -f
visualex
3
Ce -t \*n'est pas nécessaire car c'est la valeur par défaut.
Palec
1
git remote set-head origin -apourrait être utile. Il définit la branche par défaut d'origine ( refs/remotes/origin/HEAD) telle qu'elle est définie dans le référentiel distant. git clonele fait automatiquement, contrairement à git remote add -f.
Palec
212

@Andrew y a répondu clairement ici . Mais aussi simple que cela fonctionne également même si le répertoire n'est pas vide:

git init .
git remote add origin <repository-url>
git pull origin master
ambes
la source
Je suis heureux de confirmer qu'il <repository-url>peut également s'agir d'un git remote add origin /path/to/existing/repo
dépôt
60

Pour être sûr de pouvoir cloner le référentiel, accédez à n'importe quel répertoire temporaire et clonez le projet à cet endroit:

git clone ssh://[email protected]/home/user/private/repos/project_hub.git

Cela clonera votre contenu dans un project_hubrépertoire.

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

mv project_hub /path/to/new/location

C'est sûr et ne nécessite aucune substance magique autour.

eckes
la source
9
Cela créera un sous-répertoire dans le /path/to/new/locationrépertoire préexistant , ce qui n'est certainement pas l'objet de la question.
Pavel Šimerda
Ensuite, vous devrez déplacer manuellement les fichiers cachés ou utiliser une commande compliquée ... et cela ne répond pas à la question.
Black
54
git clone your-repo tmp && mv tmp/.git . && rm -rf tmp && git reset --hard
return1.at
la source
c'est un tweak: D
Sarnath Jegadeesan
15

Hmm ... spécifiant le chemin actuel absolu en utilisant $(pwd)travaillé pour moi.

git clone https://github.com/me/myproject.git $(pwd)

version git: 2.21.0

Nick Grealy
la source
13

Si le répertoire courant est vide, alors cela fonctionnera:

git clone <repository> foo; mv foo/* foo/.git* .; rmdir foo
GoZoner
la source
1
dans mon cas, cela a fonctionné même avec certains fichiers dans le '.' d'annuaire
OSdave
2
Notez que tous les fichiers dot dans les répertoires sous foo, par exemple. foo / bar / .foobar ne sera pas déplacé avec cette commande. Voir la réponse de @phatblat
lea
10

En plus de la réponse de @ StephaneDelcroix, avant d'utiliser:

git clone [email protected]/my-project.git .

assurez-vous que votre répertoire actuel est vide en utilisant

ls -a
Jakehao
la source
Face à ce problème aujourd'hui. Il s'est avéré que j'avais caché les dossiers .git et .gitignore dans le répertoire dans lequel j'essayais de cloner le référentiel. Lorsque j'ai supprimé ces dossiers, tout allait bien.
Tamara du
Quelle serait la commande pour vider le répertoire actuel? Je pense que ce serait plus utile que de simplement le vérifier :)
pie6k
9

Solution: Dans ce cas, la solution utilisait le dot, donc:rm -rf .* && git clone ssh://[email protected]/home/user/private/repos/project_hub.git .

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

Les crédits vont à: @James McLaughlin sur les commentaires ci-dessous.

MEM
la source
10
Cela semble mauvais, car. * Inclut le répertoire parent! moi: ~ / tmp / tmp / tmp $ ls -d .* . .. moi: ~ / tmp / tmp / tmp $
stackunderflow
Cela n'aide pas, car j'ai des dépendances dans le répertoire où je dois extraire.
b01
18
Je ne suis pas sûr qu'il soit sage d'écrire rm -rf (sous quelque forme que ce soit) dans une réponse SO sans signe d'avertissement VRAIMENT effrayant. Un utilisateur inexpérimenté pourrait venir ici à la recherche de la «coche verte» (généralement la meilleure réponse), puis copier-coller cette commande et ce poof ... il va son travail acharné dans le répertoire actuel. BTW: rm -rf ./.*est "plus sûr" si vous supprimez simplement les fichiers et répertoires cachés (point) sous le répertoire actuel (tout comme @stackunderflow l'a indiqué avant moi). Mais rm -rfc'est une commande dangereuse pour les utilisateurs inexpérimentés, alors soyez prudent! Juste mes 2 cents.
Andrew
fonctionne sur 1.7.1 Le seul dossier à l'intérieur était .gitaprès git init(je le savais)
vladkras
Vous n'avez pas besoin -rfde supprimer les fichiers normaux. Veuillez envisager de supprimer cette réponse ou au moins d'en accepter une autre.
Navin
6

Amélioration de la réponse de @ GoZoner:

git clone <repository> foo; shopt -s dotglob nullglob; mv foo/* .; rmdir foo

La commande shopt est tirée de cette réponse SO et modifie le comportement de la commande 'mv' sur Bash pour inclure les fichiers dot, dont vous aurez besoin d'inclure le répertoire .git et tout autre fichier caché.

Notez également que cela ne fonctionne que tel que si le répertoire en cours (.) Est vide, mais cela fonctionnera tant qu'aucun des fichiers du référentiel cloné n'aura le même nom que les fichiers du répertoire en cours. Si vous ne vous souciez pas du contenu du répertoire en cours, vous pouvez ajouter l'option -f (force) à la commande 'mv'.

phatblat
la source
6

J'avais ce même besoin. Dans mon cas, j'avais un dossier Web standard créé par une installation de serveur Web. Aux fins de cette illustration, disons que c'est

/server/webroot

et webroot contient d'autres fichiers et dossiers standard. Mon référentiel ne contient que les fichiers spécifiques au site (html, javascript, CFML, etc.)

Tout ce que j'avais à faire était:

cd /server/webroot

git init

git pull [url to my repo.git]

Vous devez faire attention à faire le git init dans le dossier cible car si vous ne le faites PAS, une des deux choses se produira:

  1. Le pull git échouera simplement avec un message sur aucun fichier git, dans mon cas:

fatal: Pas un référentiel git (ou aucun des répertoires parents): .git

  1. S'il est un endroit de fichier .git dans le chemin parent dans le dossier de votre repo tiré sera créé dans ce parent qui contient le fichier .git. Cela m'est arrivé et j'en ai été surpris ;-)

Cela n'a perturbé aucun des fichiers "standard" que j'ai dans mon dossier webroot, mais j'ai dû les ajouter au fichier .gitignore pour empêcher leur ajout par inadvertance aux validations suivantes.

Cela semble être un moyen facile de "cloner" dans un répertoire non vide. Si vous ne voulez pas que les fichiers .git et .gitignore soient créés par le pull, supprimez-les simplement après le pull.

igeocacher
la source
5

Améliorant encore la réponse de @ phatblat :

git clone --no-checkout <repository> tmp \
  && mv tmp/.git . \
  && rmdir tmp \
  && git checkout master

comme une doublure:

git clone --no-checkout <repository> tmp && mv tmp/.git . && rmdir tmp && git checkout master

166_MMX
la source
2
shopt -s dotglob
git clone ssh://[email protected]/home/user/private/repos/project_hub.git tmp && mv tmp/* . && rm -rf tmp
John Josef
la source
3
Fournissez plus d'informations pour expliquer pourquoi votre code résout le problème et que fait-il.
Martin
"git clone ... tmp" - crée le dossier / tmp dans le répertoire où la commande est exécutée et clone le référentiel Git. Puis "mv tmp / *." - déplace tous les fichiers du dossier / tmp dans le dossier parent (où la commande précédente a été exécutée) et enfin "rm -rf tmp" - supprime le dossier / tmp.
Marinski
1

utiliser. (point) à la fin de votre commande comme ci-dessous

URL de clonage git .

Upendra
la source
Cela ne fonctionne pas sur mac, cela provoque une erreur: fatal: destination path '.' already exists and is not an empty directory.
Pedro Luz
Pour mac :: Vous devriez sous le répertoire parent, puis utiliser le nom du dossier au lieu de. (Point) comme ci-dessous git clone URL flodername Assurez-vous que votre dossier est vide.
Upendra
0

Voici ce que j'ai trouvé:

Je vois ça:

fatal: destination path 'CouchPotatoServer' already exists and is not an empty directory.

Parmi mes recherches, je suis tombé sur:

https://couchpota.to/forum/viewtopic.php?t=3943

Cherchez l'entrée par Clinton. Hall ... Si vous essayez cela (comme je l'ai fait), vous obtiendrez probablement le access denied réponse, il y avait mon 1er indice, donc l'erreur initiale (pour moi), était en fait en train d'échapper à la mauvaise racine problème.

Solution pour cela dans Windows: assurez-vous que vous exécutez cmdou git elevated, puis exécutez:

git clone https://github.com/RuudBurger/CouchPotatoServer.git

Ce qui précède était mon problème et l'élévation a tout simplement fonctionné pour moi.

ynotjs
la source
0

La solution Windowsconsiste à cloner le référentiel dans un autre dossier, puis à le copier-coller à l'emplacement d'origine ou simplement à copier le .gitdossier invisible.

croppio.com
la source
-1

Suppression avec

rm -rf. *

peut vous causer des ennuis ou d'autres erreurs.

Si vous avez / chemin / vers / dossier, et que vous souhaitez supprimer tout ce qui se trouve à l'intérieur, mais pas ce dossier, exécutez simplement:

rm -rf / chemin / vers / dossier / *

Sid
la source
-1

J'ai donc corrigé cette même erreur en supprimant le dossier .git caché dans mon répertoire racine, puis en ajoutant un point au 'git clone repo'. dans mon dossier racine / dist. Ceci dans le cadre d'un projet webpack vue-cli. Donc, ce que tout le monde dit est juste, cela signifie généralement que vous avez un suivi git dans le dossier dans lequel vous essayez de cloner ou dans le dossier parent ou à la racine du dossier en question!

Akin Hwan
la source
-1
git clone ssh://[email protected]/home/user/private/repos/project_hub.git $(pwd)
Catalin
la source
Notez que cela entraînera toujours la même erreur publiée dans la question (" fatal: le chemin de destination 'résolu / chemin / de / pwd' existe déjà et n'est pas un répertoire vide. ") Si vous le faites dans un non-vide annuaire.
Gino Mempin
-2

il est utile de créer un nouveau fichier mkdir filename, puis d'exécuter la commande de git clone xxxxx, cela fonctionne sur mon ordinateur

plus fou-qi
la source
-3

J'ai vu cette question tant de fois - et je veux juste souligner que git pull de l'intérieur de votre répertoire fera l'affaire.

À moins que je manque quelque chose ici - cela a fonctionné pour moi.

Itamar
la source
5
git pullne fera rien si vous n'avez pas de référentiel défini, ce qui est une partie critique de ce qui git clonefait.
hackel