Clone Git sans répertoire .git

145

Y a-t-il un indicateur à passer gitlors d'un clonage, disons ne pas cloner le .gitrépertoire? Sinon, que diriez-vous d'un drapeau pour supprimer le .gitrépertoire après le clonage?

Justin
la source
41
Cette question n'est pas une dupe de Comment faire une "exportation git" (comme "exportation svn") . Cette question demande comment cloner un référentiel (distant) sans le .gitrépertoire. Le prétendu dupe demande comment exporter un référentiel existant où vous avez déjà le .gitrépertoire.
mknaf
3
Se mettre d'accord. Vous ne pouvez pas git archiveéloigner le référentiel comme le dit la solution de "duplication possible".
Vladislav Rastrusny

Réponses:

215

Utilisation

git clone --depth=1 --branch=master git://someserver/somerepo dirformynewrepo
rm -rf ./dirformynewrepo/.git
  • L'option de profondeur s'assurera de copier le moins d'historique possible pour obtenir ce dépôt.
  • L'option de branche est facultative et si elle n'est pas spécifiée, elle obtiendra master.
  • La deuxième ligne fera de votre répertoire dirformynewrepoplus un dépôt Git.
  • Si vous effectuez un clonage de sous-module récursif, les paramètres de profondeur et de branche ne s'appliquent pas aux sous-modules.
Adam Dymitruk
la source
19
que veut !$/.gitdire?
Jürgen Paul
15
Pour ceux qui sont intéressés, c'est l'un des désignateurs de mots , qui fait partie de la fonction d' expansion de l' historique de Bash et zsh.
Rufflewind
Existe-t-il un moyen d'obtenir la profondeur = 1 de toutes les branches du repo? pas seulement maître ou branche spécifiée
Gayan Pathirage
2
vous faites cela avec l'option --no-single-branch, puisque --depth implique --single-branch, vous pouvez le désimpliquer avec --no-single-branch. (Tiré de la page de manuel git clone)
Robert Stoddard
8
L'utilisation !$, bien que techniquement correcte dans ce cas, ne fait rien pour aider les personnes qui ne reconnaissent pas la syntaxe à comprendre la réponse à la question réelle. Il s'appuie également sur la deuxième commande suivant directement la première, et dans le même shell. Si quelqu'un omet ces exigences implicites, il peut finir par supprimer complètement autre chose. Par conséquent, je suggère que votre réponse pourrait être améliorée en spécifiant explicitement le nom dirformynewrepocomme argument de la rmcommande car cela rendra la connexion entre les deux commandes beaucoup plus claire.
davidA
29

puisque vous ne voulez que les fichiers, vous n'avez pas besoin de les traiter comme un dépôt git.

rsync -rlp --exclude '.git' user@host:path/to/git/repo/ .

et cela ne fonctionne qu'avec le chemin local et le chemin ssh / rsync distant, cela peut ne pas fonctionner si le serveur distant ne fournit que l'accès git: // ou https: //.

Huang Tao
la source
cela ne prendra pas en considération .gitignore?
JJ Roman
itub a raison, il s'agit simplement de copier l'arbre de travail. git checkout faisait ça correctement, maintenant ce n'est plus le cas.
Sylvain
alors, que faites-vous si le serveur ne fournit que l'accès git: //?
Rainb le
4

Sinon, si Node.js est installé, vous pouvez utiliser la commande suivante:

npx degit GIT_REPO

npxest livré avec Node, et il vous permet d'exécuter des packages basés sur des nœuds binaires sans les installer au préalable (vous pouvez également d'abord installer degitglobalement en utilisant npm i -g degit).

Degit est un outil créé par Rich Harris, le créateur de Svelte et Rollup, qu'il utilise pour créer rapidement un nouveau projet en clonant un référentiel sans conserver le dossier git. Mais il peut également être utilisé pour cloner n'importe quel dépôt une fois ...

Erik Vullings
la source
-1

Tu peux toujours faire

git clone git://repo.org/fossproject.git && rm -rf fossproject/.git

la source
45
télécharger tout et supprimer le répertoire plus tard? par exemple, emacs a 95% de 1 Go dans le .git. donc --depth = 1 est la solution ici clairement.
RParadox
1
Je vois toujours le dossier .git quand je fais depth = 1
Aryeh Armon
@AryehArmon bien sûr que vous le voyez. L'utilisation de --depth n'empêche pas la création de .git, cela en fait juste une copie superficielle, donc de taille beaucoup plus petite pour .git. Mais si vous ne le voulez pas du tout, vous devez le supprimer par la suite.
zeycus