Git clon sin directorio .git

145

¿Hay una bandera para pasar gital hacer un clon, digamos no clonar el .gitdirectorio? Si no, ¿qué tal una bandera para eliminar el .gitdirectorio después del clon?

Justin
fuente
41
Esta pregunta no es un engaño de Cómo hacer una "exportación git" (como "svn export") . Esta pregunta pregunta cómo clonar un repositorio (remoto) sin el .gitdirectorio. El presunto engañado pregunta cómo exportar un repositorio existente donde ya tiene el .gitdirectorio.
mknaf
3
De acuerdo. No puede git archiverepositorio remoto como dice la solución "posible duplicado".
Vladislav Rastrusny

Respuestas:

215

Utilizar

git clone --depth=1 --branch=master git://someserver/somerepo dirformynewrepo
rm -rf ./dirformynewrepo/.git
  • La opción de profundidad se asegurará de copiar la menor cantidad de historial posible para obtener ese repositorio.
  • La opción de bifurcación es opcional y si no se especifica obtendría master.
  • La segunda línea hará que su directorio ya dirformynewrepono sea un repositorio Git.
  • Si está haciendo un clon de submódulos recursivo, el parámetro de profundidad y ramificación no se aplica a los submódulos.
Adam Dymitruk
fuente
19
que !$/.gitsignifica
Jürgen Paul
15
Para aquellos interesados, es uno de los designadores de palabras , parte de la función de expansión del historial en Bash y zsh.
Rufflewind
¿Hay alguna manera de obtener la profundidad = 1 de todas las ramas en el repositorio? no solo maestro o rama especificada
Gayan Pathirage
2
puede hacer eso con la opción --no-single-branch, ya que --depth implica --single-branch, puede no implicarlo con --no-single-branch. (Tomado de la página de manual de git clone)
Robert Stoddard
8
El uso !$, aunque técnicamente correcto en este caso, no ayuda a las personas que no reconocen la sintaxis a comprender la respuesta a la pregunta real. También se basa en el segundo comando que sigue directamente al primero y dentro del mismo shell. Si alguien omite esos requisitos implícitos, puede terminar eliminando algo completamente diferente. Por lo tanto, sugiero que su respuesta podría mejorarse especificando explícitamente el nombre dirformynewrepocomo argumento del rmcomando, ya que hará que la conexión entre ambos comandos sea mucho más clara.
davidA
29

Como solo desea los archivos, no necesita tratarlos como un repositorio git.

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

y esto solo funciona con la ruta local y la ruta remota ssh / rsync, puede que no funcione si el servidor remoto solo proporciona acceso git: // o https: //.

Huang Tao
fuente
que no tendrá en cuenta .gitignore?
JJ Roman
itub tiene razón, esto es solo copiar el árbol de trabajo. git checkout solía hacerlo correctamente, ahora ya no lo hace.
Sylvain
entonces, ¿qué haces si el servidor solo proporciona acceso git: //?
Rainb
4

Alternativamente, si tiene Node.js instalado, puede usar el siguiente comando:

npx degit GIT_REPO

npxviene con Node, y le permite ejecutar paquetes basados ​​en nodos binarios sin instalarlos primero (alternativamente, primero puede instalar degitglobalmente usandonpm i -g degit ).

Degit es una herramienta creada por Rich Harris, el creador de Svelte and Rollup, que utiliza para crear rápidamente un nuevo proyecto clonando un repositorio sin mantener la carpeta git. Pero también se puede usar para clonar cualquier repositorio una vez ...

Erik Vullings
fuente
-1

Siempre puedes hacer

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

fuente
45
descargar todo y eliminar el directorio más tarde? por ejemplo, emacs tiene el 95% de 1GB en el .git. entonces --depth = 1 es la solución aquí claramente.
RParadox
1
Todavía veo la carpeta .git cuando hago profundidad = 1
Aryeh Armon
@AryehArmon, por supuesto, lo ves. El uso de --depth no impide la creación de .git, solo lo convierte en una copia superficial, un tamaño mucho más pequeño para .git. Pero si no lo desea allí, debe eliminarlo después.
zeycus