Pregunta Hacer una "exportación git" (como "svn export")?


Me he estado preguntando si hay una buena solución de "exportación git" que crea una copia de un árbol sin el .git directorio del repositorio. Hay al menos tres métodos que conozco:

  1. git clone seguido de eliminar el .git directorio del repositorio.
  2. git checkout-index alude a esta funcionalidad, pero comienza con "Simplemente lea el árbol deseado en el índice ..." que no estoy del todo seguro de cómo hacerlo.
  3. git-export es un script de terceros que esencialmente hace un git clone en un lugar temporal seguido de rsync --exclude='.git' en el destino final.

Ninguna de estas soluciones realmente me parece satisfactoria. El más cercano a svn export podría ser la opción 1, porque ambas requieren que el directorio de destino esté vacío primero. Pero la opción 2 parece incluso mejor, asumiendo que puedo descifrar qué significa leer un árbol en el índice.


2165
2017-10-02 02:21


origen


Respuestas:


Probablemente la forma más simple de lograr esto es con git archive. Si realmente necesita solo el árbol expandido, puede hacer algo como esto.

git archive master | tar -x -C /somewhere/else

La mayoría de las veces que necesito 'exportar' algo de git, quiero un archivo comprimido en cualquier caso, así que hago algo como esto.

git archive master | bzip2 >source-tree.tar.bz2

Archivo ZIP:

git archive --format zip --output /full/path/to/zipfile.zip master 

git help archive para más detalles, es bastante flexible.


Tenga en cuenta que aunque el archivo no contendrá el directorio .git, sin embargo, contendrá otros archivos ocultos específicos de git como .gitignore, .gitattributes, etc. Si no los quiere en el archivo, asegúrese de use el atributo export-ignore en un archivo .gitattributes y confirme esto antes de hacer su archivo. Lee mas...


Nota: Si está interesado en exportar el índice, el comando es

git checkout-index -a -f --prefix=/destination/path/

(Ver La respuesta de Greg para más detalles)


2195
2017-10-02 18:13



Descubrí qué opción 2 significa. Desde un repositorio, puedes hacer:

git checkout-index -a -f --prefix=/destination/path/

La barra al final de la ruta es importante, de lo contrario resultará en que los archivos estén en / destination con un prefijo de 'ruta'.

Como en una situación normal el índice contiene los contenidos del repositorio, no hay nada especial que hacer para "leer el árbol deseado en el índice". Ya está allí.

los -a se requiere indicador para verificar todos los archivos en el índice (no estoy seguro de qué significa omitir este indicador en esta situación, ya que no hace lo que quiero). los -f el indicador fuerza sobrescribir cualquier archivo existente en la salida, lo que normalmente no hace este comando.

Este parece ser el tipo de "exportación git" que estaba buscando.


301
2017-10-02 03:03



git archive también funciona con repositorio remoto.

git archive --format=tar \
--remote=ssh://remote_server/remote_repository master | tar -xf -

Para exportar una ruta particular dentro del repositorio agrega tantas rutas como desees como último argumento a git, p. Ej .:

git archive --format=tar \
--remote=ssh://remote_server/remote_repository master path1/ path2/ | tar -xv

241
2017-12-09 18:59



enter image description here

Una respuesta de caso especial si el repositorio está alojado en GitHub.

Solo usa svn export.

Por lo que sé, Github no permite archive --remote. Aunque GitHub es svn compatible y tienen todos los repositorios git svn accesible para que pueda usar svn export como lo haría normalmente con algunos ajustes en su url de GitHub.

Por ejemplo, para exportar un repositorio completo, observe cómo trunken la URL reemplaza master (o lo que sea La rama HEAD del proyecto está configurada para)

svn export https://github.com/username/repo-name/trunk/

Y puede exportar un solo archivo o incluso una determinada ruta o carpeta:

svn export https://github.com/username/repo-name/trunk/src/lib/folder

Ejemplo con jQuery JavaScript Library

los HEAD rama o dominar rama estará disponible usando trunk:

svn ls https://github.com/jquery/jquery/trunk

El no-HEAD  ramas será accesible bajo /branches/:

svn ls https://github.com/jquery/jquery/branches/2.1-stable

Todas etiquetas debajo /tags/ en la misma moda:

svn ls https://github.com/jquery/jquery/tags/2.1.3

48
2017-10-30 17:03



Desde el Git Manual:

Usando git-checkout-index para "exportar un árbol completo"

La habilidad de prefijo básicamente hace que sea trivial usar git-checkout-index como una función de "exportación como árbol". Simplemente lea el árbol deseado en el índice y haga lo siguiente:

$ git checkout-index --prefix=git-export-dir/ -a


38
2017-10-02 02:27



He escrito un envoltorio simple git-checkout-index que puedes usar así:

git export ~/the/destination/dir

Si el directorio de destino ya existe, deberás agregar -f o --force.

La instalación es simple; simplemente suelta el script en algún lugar de tu PATHy asegúrate de que sea ejecutable.

El repositorio de Github para git-export 


37
2017-10-16 17:17



Parece que esto es menos un problema con Git que con SVN. Git solo coloca una carpeta .git en la raíz del repositorio, mientras que SVN coloca una carpeta .svn en cada subdirectorio. Así que "svn export" evita la magia recursiva de la línea de comandos, mientras que con Git la recursión no es necesaria.


35
2018-05-12 04:20



El equivalente de

svn export . otherpath

dentro de un repositorio existente es

git archive branchname | (cd otherpath; tar x)

El equivalente de

svn export url otherpath

es

git archive --remote=url branchname | (cd otherpath; tar x)

26
2018-02-23 15:41



Yo uso git-submódulos extensivamente. Esta funciona para mí:

rsync -a ./FROM/ ./TO --exclude='.*'

21
2017-09-13 06:26



Si no está excluyendo archivos con .gitattributes  export-ignore entonces intenta git checkout

mkdir /path/to/checkout/
git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout -f -q

-F
  Cuando revise las rutas desde el índice, no falle en las no unidas   entradas; en su lugar, las entradas no fusionadas se ignoran.

y

-q
  Evitar verboso

Además, puede obtener cualquier rama o etiqueta o desde una revisión de confirmación específica como en SVN simplemente agregando SHA1 (SHA1 en Git es el equivalente al número de revisión en SVN)

mkdir /path/to/checkout/
git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout 2ef2e1f2de5f3d4f5e87df7d8 -f -q -- ./

los /path/to/checkout/ debe estar vacío, Git no eliminará ningún archivo, pero sobrescribirá los archivos con el mismo nombre sin ninguna advertencia

ACTUALIZAR: Para evitar el problema de decapitación o dejar intacto el repositorio de trabajo cuando se utiliza el pago y envío para exportar con etiquetas, ramas o SHA1, debe agregar -- ./ al final

El doble tablero -- le dice a git que todo después de los guiones son caminos o archivos, y también en este caso dice git checkout para no cambiar el HEAD

Ejemplos:

Este comando obtendrá solo el directorio libs y también el readme.txt archivo de eso exactamente cometer

git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout fef2e1f2de5f3d4f5e87df7d8 -f -q -- ./libs ./docs/readme.txt

Esto creará (sobrescribirá) my_file_2_behind_HEAD.txt dos se compromete detrás de la cabeza HEAD^2

git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout HEAD^2 -f -q -- ./my_file_2_behind_HEAD.txt

Para obtener la exportación de otra sucursal

git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout myotherbranch -f -q -- ./

Darse cuenta de ./ es relativo a la raíz del repositorio


20
2017-12-10 17:17



Esto copiará todo el contenido, menos los archivos .dot. Utilizo esto para exportar proyectos clonados de git en el repositorio git de mi aplicación web sin las cosas de .git.

cp -R ./path-to-git-repo / path / to / destination /

Plain old bash funciona simplemente genial :)


16
2018-01-22 17:31