Git Clone: ​​¿Solo los archivos, por favor?

141

Quiero clonar un repositorio GIT y NO terminar con un .gitdirectorio. En otras palabras, solo quiero los archivos. ¿Hay alguna forma de hacer esto?

git clone --no-checkouthice exactamente lo contrario de lo que quiero (me dio solo el .gitdirectorio).

Estoy tratando de hacer eso para un repositorio remoto , no local, lo que significa que esto no es un duplicado de " Cómo hacer una" exportación git "(como" svn export ") " (aunque la solución podría terminar siendo la mismo).

Dan Rosenstark
fuente
55
posible duplicado de Cómo hacer una "exportación git" (como "svn export")
Greg Hewgill
@ Greg Hewgill Estoy tratando de hacer esto desde un repositorio remoto. Sin embargo, no estoy seguro si eso hace que esta pregunta sea única.
Dan Rosenstark el
1
Aunque esta es una pregunta más nueva, creo que vale la pena echarle un vistazo: stackoverflow.com/questions/11497457/…
eonil
1
Vea mi respuesta de actualización : git archiveahora (Q4 2017) es más preciso y no incluirá carpetas vacías.
VonC
1
De nada. Aparentemente, su comentario fue marcado y eliminado ... chat.stackoverflow.com/transcript/134259?m=39402889#39402889
VonC

Respuestas:

75

El comando git que sería el más cercano de lo que está buscando sería por git archive.
Consulte el proyecto de copia de seguridad que utiliza git : incluirá en un archivo todos los archivos (incluidos los submódulos si está utilizando el git-archive-allscript)

Luego puede usar ese archivo en cualquier lugar, devolviéndole solo archivos, no .gitdirectorio.

git archive --remote=<repository URL> | tar -t

Si necesita carpetas y archivos solo desde el primer nivel:

git archive --remote=<repository URL> | tar -t --exclude="*/*"

Para enumerar solo las carpetas de primer nivel de un repositorio remoto:

git archive --remote=<repository URL> | tar -t --exclude="*/*" | grep "/"

Nota: eso no funciona para GitHub (no compatible)

Por lo tanto, necesitaría clonar (poco profundo para acelerar el paso de clonación) y luego archivar localmente :

git clone --depth=1 [email protected]:xxx/yyy.git
cd yyy
git archive --format=tar aTag -o aTag.tar

Otra opción sería hacer un clon superficial (como se menciona a continuación), pero ubicando la carpeta .git en otro lugar.

git --git-dir=/path/to/another/folder.git clone --depth=1 /url/to/repo

La carpeta repo incluiría solo el archivo, sin .git.

Nota: git --git-dir es una opción del comandogit , no git clone.


Actualización con Git 2.14.X / 2.15 (Q4 2017): se asegurará de evitar agregar carpetas vacías .

" git archive", especialmente cuando se usa con pathpec, almacenaba un directorio vacío en su salida, aunque Git nunca lo hace.
Esto ha sido arreglado.

Ver commit 4318094 (12 de septiembre de 2017) por René Scharfe (``) .
Sugerido por: Jeff King ( peff) .
(Fusionada por Junio ​​C Hamano - gitster- en commit 62b1cb7 , 25 sep 2017)

archive: no agregue directorios vacíos a los archivos

Si bien git no rastrea los directorios vacíos, git archivepuede ser engañado para poner algunos en archivos.
Si bien eso es compatible con la base de datos de objetos, no se puede representar en el índice y, por lo tanto, es poco probable que ocurra en la naturaleza.

Como los directorios vacíos no son compatibles con git, tampoco deberían escribirse en archivos.
Si realmente se necesita un directorio vacío, se puede rastrear y archivar colocando un .gitignorearchivo vacío en él.

VonC
fuente
44
Esto funcionó para mí. Yo agregaría una cosa más. Si no te importa la carpeta .git, entonces usaría este comando:git --git-dir=/dev/null clone --depth=1 /url/to/repo
HumanSky el
Esto no elimina la carpeta .git
aliasav
@VonC Intenté: git --git-dir = / dev / null clone --depth = 1 / url / to / repo
aliasav
1
Corriendo git archive --remote=https://github.com/pornel/dssim.git @ | tar -tlo consigo tar: This does not look like a tar archive. ¿No funciona con GitHub? Además, ¿qué significa el @?
André Werlang
2
@ AndréWerlang 7 años después ... No estoy muy seguro de lo siguiente @: lo he eliminado. Además, GitHub no admite un control remoto git archive: he editado la respuesta para proponer una alternativa.
VonC
59
git archive --format=tar --remote=<repository URL> HEAD | tar xf -

tomado de aquí

Jon Penn
fuente
2
--format=tares innecesario "tar" es el resultado predeterminado, no es necesario especificarlo.
VasiliNovikov
1
entrar tar xes suficiente
Jens Bannmann
42

puede crear un clon superficial para obtener solo las últimas revisiones:

 git clone --depth 1 git://url

entonces simplemente elimine el directorio .git o úselo git archivepara exportar su árbol.

knittl
fuente
Cómo evitar este error cuando lo actualizo repitiendo el clon: "fatal: la ruta de destino 'XYZ' ya existe y no es un directorio vacío".
Sohail Si
1
@SohailSi: clone en una nueva ubicación o elimine el directorio anterior. Probablemente sea mejor buscar las nuevas revisiones, si desea actualizar su copia local.
knittl
3

¿Por qué no realizar un clon y luego eliminar el .gitdirectorio para que solo tenga una copia de trabajo desnuda?

Editar: ¿O de hecho por qué usar clon? Es un poco confuso cuando dices que quieres un repositorio git pero sin un .gitdirectorio. Si quiere decir que solo quiere una copia de algún estado del árbol, ¿por qué no hacerlo cp -Ren el shell en lugar del clon de git y luego eliminar el siguiente .git?

Andrés
fuente
Gracias por eso. Los archivos están en un repositorio de git. Esperaba poder dirigir a los usuarios de Mac a obtener una copia del repositorio en una línea, sin que se convirtiera en un repositorio GIT.
Dan Rosenstark
No debería haber personas que obtengan directamente el código del repositorio si no pueden usarlo (es decir, no tienen el repositorio Git).
alternativa
@Amoss ¿Lanzando un tarball para que la gente no esté constantemente agarrando el último código?
alternativa
1
@mathepic: y para lanzar un tarball necesitas una forma de obtener una copia de trabajo limpia del repositorio, que es exactamente la pregunta que se planteó.
Andrew
1
Leer la respuesta a continuación y luego buscar en Google condujo a otra pregunta: stackoverflow.com/questions/160608/… Si observa el uso del archivo git --remote, entonces hace exactamente lo que usted (y el póster original ) estan buscando. Editar: que es lo que Jon respondió más abajo.
Andrew
2

Parece que solo quieres una copia del código fuente. Si es así, ¿por qué no simplemente copiar el directorio y excluir el directorio .git de la copia?

JaredPar
fuente
55
Eso es lo que estoy preguntando: cómo hacer eso con git ... Sin embargo, ya puedo decir que no hay una forma integrada de hacerlo a partir de las respuestas que estoy obteniendo. ¡Gracias de cualquier manera!
Dan Rosenstark
2

git checkout -f

Hay otra forma de hacerlo dividiendo el repositorio del árbol de trabajo.

Este método es útil si necesita actualizar estos archivos git sin git de forma regular. Por ejemplo, lo uso cuando necesito revisar los archivos fuente y construir un artefacto, luego copio el artefacto en un repositorio diferente solo para su implementación en un servidor, y también lo uso al enviar el código fuente a un servidor cuando quiero código fuente para pagar y construir en el directorio www.

Haremos dos carpetas, una para el git y otra para los archivos de trabajo:

mkdir workingfiles
mkdir barerepo.git

inicializar un repositorio de git desnudo:

cd barerepo.git
git --bare init 

Luego cree un gancho posterior a la recepción:

touch hooks/post-receive
chmod ug+x hooks/post-receive

Edite la recepción posterior en su editor favorito:

GIT_WORK_TREE=/path/to/workingfiles git checkout -f
# optional stuff:
cd down/to/some/directory
[do some stuff]

Agregue esto como un control remoto:

git remote add myserver ssh://user@host:/path/to/barerepo.git

Ahora, cada vez que ingrese a este repositorio desnudo, verificará el árbol de trabajo /workingfiles/. Pero en /workingfiles/sí mismo no está bajo control de versiones; correr git statusen /workingfiles/dará el error fatal: Not a git repository (or any parent up to mount point /data). Son solo archivos simples.

A diferencia de otras soluciones, el rm -r .gitcomando no es necesario, por lo que si /workingfiles/hay algún otro repositorio git, no tiene que preocuparse por el comando utilizado para eliminar los archivos git del otro repositorio.

Golpe
fuente
1
Convenido. Aquí es posible un gancho posterior a la recepción en un repositorio desnudo. +1
VonC
mucho trabajo si solo estás tratando de obtener los archivos
Rainb
No es mucho trabajo si quieres solo los archivos de forma regular.
Golpear el