Comment cloner un référentiel Git dans un dossier spécifique?

2244

L'exécution de la commande git clone [email protected]:whatevercrée un répertoire dans mon dossier actuel nommé whateveret dépose le contenu du référentiel Git dans ce dossier:

/httpdocs/whatever/public

Mon problème est que j'ai besoin du contenu du référentiel Git cloné dans mon répertoire actuel afin qu'ils apparaissent à l'emplacement approprié pour le serveur Web:

/httpdocs/public

Je sais comment déplacer les fichiers après avoir cloné le référentiel, mais cela semble casser Git, et j'aimerais pouvoir mettre à jour simplement en appelant git pull. Comment puis-je faire ceci?

David Smith
la source
3
Sous Windows, vous pouvez déplacer des fichiers à partir du dossier où vous clonerez le dépôt [s'il y en a] de sorte qu'il soit vide lorsque vous git clonez . Après le clonage, déplacez vos fichiers en arrière [ctrl-z] et whoala ! Si le dossier actuel est vide, utilisez simplement: git clone giturl .
44
voila est l'orthographe
Matthias
82
@MatthiasDailey voilà l' orthographe réelle
silkfire
6
et voilà est français pour et voilà
Fattie

Réponses:

3223

Option A:

git clone [email protected]:whatever folder-name

Ergo, pour une right hereutilisation:

git clone [email protected]:whatever .

Option B:

Déplacez également le .gitdossier. Notez que le .gitdossier est masqué dans la plupart des explorateurs de fichiers graphiques, assurez-vous donc d'afficher les fichiers masqués.

mv /where/it/is/right/now/* /where/I/want/it/
mv /where/it/is/right/now/.* /where/I/want/it/

La première ligne saisit tous les fichiers normaux, la deuxième ligne saisit les fichiers dot. Il est également possible de le faire sur une seule ligne en activant dotglob (ie shopt -s dotglob) mais c'est probablement une mauvaise solution si vous posez la question à laquelle cette réponse répond.

Mieux encore:

Conservez votre copie de travail ailleurs et créez un lien symbolique. Comme ça:

ln -s /where/it/is/right/now /the/path/I/want/to/use

Pour vous, ce serait quelque chose comme:

ln -sfn /opt/projectA/prod/public /httpdocs/public

Qui pourrait facilement être changé pour tester si vous le vouliez, c'est-à-dire:

ln -sfn /opt/projectA/test/public /httpdocs/public

sans déplacer les fichiers. Ajouté -fndans le cas où quelqu'un copie ces lignes ( -fest forcé, -névitez certaines interactions souvent indésirables avec des liens déjà existants et non existants).

Si vous voulez simplement que cela fonctionne, utilisez l'option A, si quelqu'un d'autre va regarder ce que vous avez fait, utilisez l'option C.

Can Berk Güder
la source
8
Je n'avais pas pensé à votre option «Mieux encore» et je l'aime bien que je ne sache pas pourquoi. Quels en sont les avantages?
David Smith
6
Cela ne fournit probablement aucun avantage pour le moment, mais cela pourrait vous éviter beaucoup de problèmes si vous décidez de déplacer des choses un jour.
Can Berk Güder
12
De plus, vous pouvez basculer rapidement entre les versions avec l'option "Encore mieux". Ceci est particulièrement utile et utilisé pour les serveurs.
Halil Özgür
4
@MEM Je pense qu'il veut dire créer un lien symbolique vers .git ieln -s path/to/.git path/to/working/directory
Alexander
27
Quelqu'un peut-il expliquer les avantages de cela ?? Je suis un peu dense aujourd'hui. Comment l'utilisation d'un lien symbolique profite-t-elle aux serveurs?
triple
586

L'exemple que je pense que beaucoup de gens posent cette question est le suivant. Si vous êtes dans le répertoire dans lequel vous voulez que le contenu du référentiel git soit sauvegardé, exécutez:

git clone [email protected]:whatever .

Le "." à la fin spécifie le dossier actuel comme dossier de retrait.

J Wynia
la source
28
true, donc vous ne voulez pas exécuter "git init" dans ce dossier avant de le cloner. Mais si vous l'avez fait, la suppression du dossier .git avant le clonage fera l'affaire.
Magne
3
corrigé pour les répertoires vides dans ma réponse
csomakk
1
n'a pas pu faire fonctionner cela dans nitrous.io? même après vidage, il indique que le répertoire n'est pas vide
Tejas Manohar
@TejasManohar Assurez-vous que vous avez également supprimé les fichiers cachés.
Britic
ls -aaffichera tous les fichiers, y compris ceux cachés.
Michael Dorst
215

Allez dans le dossier .. Si le dossier est vide, alors:

git clone [email protected]:whatever .

autre

git init
git remote add origin PATH/TO/REPO
git fetch
git checkout -t origin/master
csomakk
la source
9
En fait, c'était la réponse la plus utile pour moi lorsque je devais simplement pousser le projet déjà créé vers le référentiel nouvellement créé. Gloire!
2014
13
Seule réponse qui spécifie comment passer à la caisse dans un dossier non vide, merci.
Preston Badeer
2
C'est vraiment utile car switch -ton n'est pas clairement indiqué sur la documentation de git checkout .
Chetabahana
4
que fait le commutateur -t? Je reçois un message d'abandon avec une liste de fichiers non suivis qui seront écrasés lors du paiement? que-faire dans cette situation? Je ne veux pas que ces fichiers soient écrasés?
Momin Zahid
2
-t documentation de git: -t, --track Lors de la création d'une nouvelle branche, configurez la configuration "amont". Voir "--track" dans git-branch (1) pour plus de détails.
csomakk
87

Clonage de référentiel Git de base

Vous clonez un référentiel avec

git clone [url]

Par exemple, si vous souhaitez cloner la bibliothèque Git Open Framework Drupal de Stanford University appelée open_framework, vous pouvez le faire comme ceci:

$ git clone git://github.com/SU-SWS/open_framework.git

Cela crée un répertoire nommé open_framework (à l'emplacement actuel de votre système de fichiers local), initialise un répertoire .git à l'intérieur, extrait toutes les données de ce référentiel et extrait une copie de travail de la dernière version. Si vous allez dans le répertoire open_framework nouvellement créé, vous y verrez les fichiers de projet, prêts à être travaillés ou utilisés.

Clonage d'un référentiel dans un dossier local spécifique

Si vous souhaitez cloner le référentiel dans un répertoire nommé autre que open_framework, vous pouvez spécifier cela comme option de ligne de commande suivante:

$ git clone git:github.com/SU-SWS/open_framework.git mynewtheme

Cette commande fait la même chose que la précédente, mais le répertoire cible est appelé mynewtheme.

Git dispose d'un certain nombre de protocoles de transfert différents que vous pouvez utiliser. L'exemple précédent utilise le protocole git: //, mais vous pouvez également voir http (s): // ou user @ server: /path.git, qui utilise le protocole de transfert SSH.

Craig Gjerdingen
la source
cela créera automatiquement un dossier dans votre dossier actuel et y placera les fichiers. Ainsi, vous n'avez pas à vous soucier de remplacer un autre dossier.
arn-arn
24

Pour cloner le référentiel git dans un dossier spécifique, vous pouvez utiliser un -C <path>paramètre, par exemple

git -C /httpdocs clone [email protected]:whatever

Bien qu'il crée toujours un whateverdossier par-dessus, donc pour cloner le contenu du référentiel dans le répertoire actuel, utilisez la syntaxe suivante:

cd /httpdocs
git clone [email protected]:whatever .

Notez que le clonage dans un répertoire existant est uniquement autorisée lorsque le répertoire est vide .

Puisque vous clonez dans un dossier accessible au public, envisagez de séparer votre référentiel Git de votre arborescence de travail en utilisant --separate-git-dir=<git dir>ou en excluant le .gitdossier dans la configuration de votre serveur Web (par exemple dans un .htaccessfichier).

kenorb
la source
17

Pour cloner vers Present Working Directory :

git clone https://github.com/link.git

Pour cloner vers autre répertoire :

git clone https://github.com/link.git ./Folder1/Folder2

J'espère que cela aide :)

Sarat Chandra
la source
cela a fonctionné pour moi aussi. pas ./au début du chemin vers le dossier
Alon Gouldman
13

Lorsque vous déplacez les fichiers là où vous le souhaitez, déplacez-vous également le .gitrépertoire? Selon votre système d'exploitation et votre configuration, ce répertoire peut être masqué.

Il contient le référentiel et les fichiers de prise en charge, tandis que les fichiers de projet qui se trouvent dans votre /publicrépertoire ne sont que les versions dans le commit actuellement extrait (branche principale par défaut).

Paul
la source
13

Si vous souhaitez cloner dans le dossier actuel, vous devriez essayer ceci:

git clone https://github.com/example/example.git ./
Luis
la source
8
fatal: chemin de destination '.' existe déjà et n'est pas un répertoire vide.
Cleiton
11

Usage

git clone <repository>

Clonez le référentiel situé dans le <référentiel> sur la machine locale. Le référentiel d'origine peut être situé sur le système de fichiers local ou sur une machine distante accessible via HTTP ou SSH.

git clone <repo> <directory>

Clonez le référentiel situé dans <repository> dans le dossier appelé <directory> sur la machine locale.

Source: mise en place d'un référentiel

Nagarjun
la source
9

Assurez-vous de supprimer le référentiel .git si vous essayez d'extraire quelque chose dans le répertoire actuel.

rm -rf .git puis git clone https://github.com/symfony/symfony-sandbox.git

alex
la source
3

Voici comment je le ferais, mais j'ai créé un alias pour le faire pour moi.

$ cd ~Downloads/git; git clone https:git.foo/poo.git

Il y a probablement une façon plus élégante de le faire, mais j'ai trouvé que c'était plus facile pour moi.

Voici l'alias que j'ai créé pour accélérer les choses. Je l'ai fait pour zsh, mais cela devrait très bien fonctionner pour bash ou tout autre shell comme le poisson, xyzsh, fizsh, etc.

Éditez ~/.zshrc, /.bashrcetc. avec votre éditeur préféré (le mien est Leafpad, donc j'écrirais $ leafpad ~/.zshrc).

Ma préférence personnelle, cependant, est de créer un plugin zsh pour garder une trace de tous mes alias. Vous pouvez créer un plugin personnel pour oh-my-zsh en exécutant ces commandes:

$ cd ~/.oh-my-zsh/
$ cd plugins/
$ mkdir your-aliases-folder-name; cd your-aliases-folder-name
     # In my case '~/.oh-my-zsh/plugins/ev-aliases/ev-aliases'
$ leafpad your-zsh-aliases.plugin.zsh
     # Again, in my case 'ev-aliases.plugin.zsh'

Ensuite, ajoutez ces lignes à votre fichier alises.plugin vierge nouvellement créé:

# Git aliases
alias gc="cd ~/Downloads/git; git clone "

(À partir d'ici, remplacez votre nom par le mien.)

Ensuite, pour que les alias fonctionnent, ils (avec zsh) doivent être sourcés (ou peu importe comment cela s'appelle). Pour ce faire, dans votre document de plugin personnalisé, ajoutez ceci:

## Ev's Aliases

#### Remember to re-source zsh after making any changes with these commands:

#### These commands should also work, assuming ev-aliases have already been sourced before:

allsource="source $ZSH/oh-my-zsh.sh ; source /home/ev/.oh-my-zsh/plugins/ev-aliases/ev-aliases.plugin.zsh; clear"
sourceall="source $ZSH/oh-my-zsh.sh ; source /home/ev/.oh-my-zsh/plugins/ev-aliases/ev-aliases.plugin.zsh"
#### 

####################################

# git aliases

alias gc="cd ~/Downloads/git; git clone "
# alias gc="git clone "
# alias gc="cd /your/git/folder/or/whatever; git clone "

####################################

Enregistrez votre plugin oh-my-zsh et lancez-vous allsource. Si cela ne semble pas fonctionner, lancez simplement source $ZSH/oh-my-zsh.sh; source /home/ev/.oh-my-zsh/plugins/ev-aliases/ev-aliases.plugin.zsh. Cela chargera la source du plugin qui vous permettra allsourcedésormais de l' utiliser .


Je suis en train de créer un référentiel Git avec tous mes alias. N'hésitez pas à les consulter ici: les fichiers dot d'Ev . N'hésitez pas à les bifurquer et à les améliorer pour répondre à vos besoins.

Ev-
la source
2

Si vous utilisez sshfor, git cloningvous pouvez utiliser la commande suivante.

git -C path clone [email protected]:path_to_repo.git

par exemple: git -C /home/ubuntu/ clone [email protected]:kennethreitz/requests.gittirerait le dépôt git requestsvers votre /home/ubuntu/chemin.

Ankit Singh
la source
2

Pour une raison quelconque, cette syntaxe ne se démarque pas:

git clone repo-url [folder]

Ici, le dossier est un chemin facultatif vers le dossier local (qui sera un référentiel local).

Git codera cloneégalement pulldu référentiel distant vers le référentiel local. En fait c'est vrai:

git clone repo-url  =  git init + git remote add origin repo-url + git pull
prosti
la source
0

Bien que toutes les réponses ci-dessus soient bonnes, je voudrais proposer une nouvelle méthode au lieu d'utiliser la méthode du lien symbolique dans le répertoire html public comme proposé BEST dans la réponse acceptée. Vous devez avoir accès aux configurations d'hôte virtuel de votre serveur.

Il s'agit de configurer l'hôte virtuel de votre serveur Web pointant directement vers le répertoire du référentiel. Dans Apache, vous pouvez le faire comme:

DocumentRoot / var / www / html / website / your-git-repo

Voici un exemple de fichier hôte virtuel:

<VirtualHost *:443>
    ServerName example.com

    DocumentRoot /path/to/your-git-repo
    ...
    ...
    ...
    ...
</VirtualHost>
Tarik
la source
0

Vous pouvez utiliser la commande git suivante pour cloner avec un nom de répertoire personnalisé

git clone <git_repo_url> <your_custom_directory_name>

Remarque: vous n'avez pas besoin de créer votre répertoire custome car il se créera automatiquement

Manoj Rana
la source
-1
For Windows user 

1> Open command prompt.
2> Change the directory to destination folder (Where you want to store your project in local machine.)
3> Now go to project setting online(From where you want to clone)
4> Click on clone, and copy the clone command.
5> Now enter the same on cmd .

It will start cloning saving on the selected folder you given .
Tarit Ray
la source
-5

Concernant cette ligne du post original:

"Je sais comment déplacer les fichiers après avoir cloné le dépôt, mais cela semble briser le git"

Je suis capable de le faire et je ne vois aucun problème jusqu'à présent avec mes opérations d'ajout, de validation, de poussée et d'extraction.

Cette approche est indiquée ci-dessus, mais tout simplement pas décomposée en étapes. Voici les étapes qui fonctionnent pour moi:

  1. cloner le dépôt dans un nouveau dossier temporaire
  2. cd dans ce dossier racine que vous venez de cloner localement
  3. copiez l'intégralité du contenu du dossier, y compris le répertoire /.git - dans n'importe quel dossier existant que vous aimez; (par exemple, un projet d'éclipse que vous souhaitez fusionner avec votre référentiel)

Le dossier existant dans lequel vous venez de copier les fichiers est maintenant prêt à interagir avec git.

Gene Bo
la source