Me he estado preguntando si hay una buena solución de "exportación git" que cree una copia de un árbol sin el .git
directorio del repositorio. Hay al menos tres métodos que conozco:
git clone
seguido de eliminar el.git
directorio del repositorio.git checkout-index
Alude a esta funcionalidad, pero comienza con "Simplemente lea el árbol deseado en el índice ...", que no estoy completamente seguro de cómo hacer.git-export
es un script de terceros que esencialmente realiza unagit clone
ubicación temporal seguidarsync --exclude='.git'
del destino final.
Ninguna de estas soluciones realmente me parece satisfactoria. La más cercana 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 aún mejor, suponiendo que pueda entender lo que significa leer un árbol en el índice.
git
export
git-archive
svn-export
Greg Hewgill
fuente
fuente
git archive --format zip --output "output.zip" master -0
le proporcionará un archivo sin comprimir (-0 es la marca para sin comprimir). git-scm.com/docs/git-archive .export
un subdirectorio de 250 kB directamente desde el repositorio remoto (que de otro modo podría tener un tamaño de 200 MB, excluyendo las revisiones), y solo llegaré a la red para una transferencia de descarga de 250 kB (más o menos). Congit
,archive
tiene que estar habilitado en el servidor (por lo que no puedo probarlo):clone --depth 1
del servidor aún puede recuperar un repositorio de, digamos, 25 MB, donde la.git
subcarpeta solo ocupa 15 MB. Por lo tanto, todavía diría que la respuesta es "no".git checkout-index
git archive -o latest.zip HEAD
Respuestas:
Probablemente la forma más sencilla de lograr esto es con
git archive
. Si realmente necesita solo el árbol expandido, puede hacer algo como esto.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.
Archivo ZIP:
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
(Ver la respuesta de Greg para más detalles)
fuente
git archive --format zip --output /full/path master
git archive --format zip --output /path/to/file.zip --prefix=newdir/ master
la salida se llamará 'file.zip' pero cuando lo desempaquete, el directorio de nivel superior será 'newdir'. (Si omite el atributo --prefix, el directorio de nivel superior sería 'archivo'.)git archive -o latest.zip HEAD
crea un archivo Zip que contiene el contenido de la última confirmación en la rama actual. Tenga en cuenta que el formato de salida se infiere por la extensión del archivo de salida.Descubrí qué significa la opción 2. Desde un repositorio, puede hacer:
La barra diagonal al final de la ruta es importante, de lo contrario, los archivos estarán en / destino con el prefijo 'ruta'.
Como en una situación normal el índice contiene el contenido del repositorio, no hay nada especial que hacer para "leer el árbol deseado en el índice". Ya esta ahí.
Se
-a
requiere el indicador para verificar todos los archivos en el índice (no estoy seguro de lo que significa omitir este indicador en esta situación, ya que no hace lo que quiero). La-f
bandera obliga a sobrescribir cualquier archivo existente en la salida, lo que este comando normalmente no hace.Este parece ser el tipo de "exportación de git" que estaba buscando.
fuente
git add
comando cambia el contenido en el índice, por lo que lo que segit status
muestra como "para confirmar" son las diferencias entre HEAD y el contenido del índice.~
('~'
¡ no !) En su directorio de trabajo. No hay nada especialgit checkout-index
al respecto: lo mismo es ciertomkdir '~/dest'
( ¡no hagas eso! ). Otra buena razón para evitar los nombres de archivo que necesitan comillas (por ejemplo, que tienen un espacio en ellos) :-)git archive
También funciona con repositorio remoto.Para exportar una ruta particular dentro del repositorio, agregue tantas rutas como desee como último argumento para git, por ejemplo:
fuente
git archive --format=tar --prefix=PROJECT_NAME/ --remote=USER@SERVER:PROJECT_NAME.git master | tar -xf -
(asegura que su archivo esté en una carpeta)git archive --format=zip --output foo.zip --remote=https://github.com/xxx.git master
Y me puse fatal: Operación no compatible con el protocolo. Fin inesperado de la secuencia de comandos.curl -L https://api.github.com/repos/VENDOR/PROJECT/tarball | tar xzf -
por documentosUna respuesta de caso especial si el repositorio está alojado en GitHub.
Solo úsalo
svn export
.Que yo sepa, Github no lo permite
archive --remote
. Aunque GitHub es compatible con svn y tienen todos los repositorios de gitsvn
accesibles, por lo que podría usarlosvn export
como lo haría normalmente con algunos ajustes en su URL de GitHub.Por ejemplo, para exportar un repositorio completo, observe cómo
trunk
en la URL reemplazamaster
(o lo que sea que se establezca la rama HEAD del proyecto ):Y puede exportar un solo archivo o incluso una determinada ruta o carpeta:
Ejemplo con jQuery JavaScript Library
La
HEAD
sucursal o la sucursal maestra estarán disponibles usandotrunk
:Las no
HEAD
sucursales serán accesibles bajo/branches/
:Todas las etiquetas debajo
/tags/
de la misma manera:fuente
git archive
funciona bien con GitHub, siempre que use el protocolo git, solo reemplacehttps://
congit://
en la URL. No sé por qué GitHub no anuncia esta característica oculta.fatal: The remote end hung up unexpectedly
. Intenté en dos servidores diferentes con jQuery github repo.git config url.<base>.insteadOf
para almacenar en caché el repositorio remoto. Por lo tanto, estaba usando unafile://
URL en realidad. Dudo quegit archive
alguna vez pueda funcionar con lasgit://
URL, ya que debe poder ejecutarsegit-upload-archive
en el extremo remoto. Debería ser posible usar elssh
protocolo, excepto que github no lo permite (Invalid command: 'git-upload-archive'
).Del manual de Git :
Usando git-checkout-index para "exportar un árbol completo"
La capacidad del prefijo básicamente hace que sea trivial usar git-checkout-index como una función "exportar como árbol". Simplemente lea el árbol deseado en el índice y haga:
$ git checkout-index --prefix=git-export-dir/ -a
fuente
git read-tree bar:foo
Y luego,git checkout-index --prefix=export_dir/ -a
tal vez debería hacerlogit update-index master
He escrito un contenedor simple
git-checkout-index
que puedes usar así:Si el directorio de destino ya existe, deberá agregar
-f
o--force
.La instalación es simple; simplemente suelte el script en algún lugar de su
PATH
, y asegúrese de que sea ejecutable.El repositorio de github para
git-export
fuente
Parece que este es un problema menor con Git que SVN. Git solo coloca una carpeta .git en la raíz del repositorio, mientras que SVN coloca una carpeta .svn en cada subdirectorio. Entonces, "svn export" evita la magia recursiva de la línea de comandos, mientras que con Git la recursión no es necesaria.
fuente
El equivalente de
dentro de un repositorio existente es
El equivalente de
es
fuente
git archive --format=tar --prefix=junk/ HEAD | (tar -t -v --full-time -f -)
... Sin embargo, el archivo con marcas de tiempo no es exactamente trivial, así que publiqué un ejemplo a continuación .git archive branchname | tar xC otherpath
C
opción de alquitrán es solo GNU Tar.Si no está excluyendo archivos con
.gitattributes
export-ignore
, intentegit checkout
y
Además, puede obtener cualquier rama o etiqueta o de una revisión de confirmación específica como en SVN simplemente agregando el SHA1 (SHA1 en Git es el equivalente al número de revisión en SVN)
El
/path/to/checkout/
debe estar vacío, Git no borrará cualquier archivo, pero se sobreponen a los archivos con el mismo nombre sin ninguna advertenciaACTUALIZACIÓN: para evitar el problema de decapitación o dejar intacto el repositorio de trabajo cuando se utiliza el proceso de pago para la exportación con etiquetas, ramas o SHA1, debe agregar
-- ./
al finalEl guión doble
--
le dice a git que todo después de los guiones son rutas o archivos, y también en este caso le indicagit checkout
que no cambie elHEAD
Ejemplos:
Este comando obtendrá solo el directorio libs y también el
readme.txt
archivo de esa confirmación exactaEsto creará (sobrescribirá)
my_file_2_behind_HEAD.txt
dos confirmaciones detrás de la cabezaHEAD^2
Para obtener la exportación de otra sucursal
Observe que
./
es relativo a la raíz del repositoriofuente
Yo uso git-submodules ampliamente. Esta funciona para mí:
fuente
.htaccess
?rsync
enumera el argumento como--cvs-exclude
. Además, todavía se copia.gitattributes
y.gitignore
Llegué a esta página con frecuencia cuando buscaba una forma de exportar un repositorio git. Mi respuesta a esta pregunta considera tres propiedades que tiene svn export por diseño en comparación con git, ya que svn sigue un enfoque de repositorio centralizado:
La exportación de una determinada rama utilizando svn se realiza especificando la ruta adecuada
Al construir una determinada versión, es útil clonar una rama estable como, por ejemplo,
--branch stable
o--branch release/0.9
.fuente
git archive | tar
enfoque no es aplicable a entornos shell incompatibles con POSIX (por ejemplo, CI basado en CMD o PowerShell de AppVeyor), lo que no es ideal. Elgit checkout
enfoque modifica el índice del árbol de trabajo principal, lo cual es horrible. Elgit checkout-index
enfoque requiere que el índice del árbol de trabajo principal se modifique de antemano, lo que es aún peor. Elgit clone
enfoque tradicional clona la totalidad del historial del repositorio antes de eliminar ese historial, lo cual es un desperdicio. Esta es la única solución sana que queda.file://
protocolo (por ejemplo,git clone --depth 1 --branch v3.14.15 file:///home/me/src_repo trg_repo
). De lo"warning: --depth is ignored in local clones; use file:// instead."
contrario , emitirá y realizará un clon estándar en lugar de un clon superficial, lo que anulará el propósito de esta respuesta. Salud!Esto copiará todo el contenido, menos los archivos .dot. Lo uso para exportar proyectos clonados con git al repositorio de git de mi aplicación web sin el material .git.
Bash viejo bash funciona simplemente genial :)
fuente
.gitignore
, esto no lo hará.Tan simple como clonar, luego elimine la carpeta .git:
git clone url_of_your_repo path_to_export && rm -rf path_to_export/.git
fuente
Para los usuarios de GitHub, el
git archive --remote
método no funcionará directamente, ya que la URL de exportación es efímera . Debes pedirle a GitHub la URL, luego descargar esa URL.curl
lo hace fácil:Esto le dará el código exportado en un directorio local. Ejemplo:
Editar
Si desea que el código se coloque en un directorio específico existente (en lugar del aleatorio de github):
fuente
Sí, este es un comando limpio y ordenado para archivar su código sin ninguna inclusión de git en el archivo y es bueno pasarlo sin preocuparse por ningún historial de confirmación de git.
fuente
Solo quiero señalar que en el caso de que seas
Luego puede usar en
cp foo [destination]
lugar de lo mencionadogit-archive master foo | -x -C [destination]
.fuente
Puede archivar un repositorio remoto en cualquier confirmación como archivo zip.
fuente
Bash-implementación de git-export.
He segmentado los procesos de creación y eliminación de archivos .empty en su propia función, con el propósito de reutilizarlos en la implementación 'git-archive' (se publicará más adelante).
También he agregado el archivo '.gitattributes' al proceso para eliminar los archivos no deseados de la carpeta de exportación de destino. Incluye verbosidad al proceso al tiempo que hace que la función 'git-export' sea más eficiente.
EMPTY_FILE = ". Empty";
fuente
Si quieres algo que funcione con submódulos, vale la pena intentarlo.
Nota:
Suposiciones
fuente
Mi preferencia en realidad sería tener un destino dist en su Makefile (u otro sistema de compilación) que exporte un archivo distribuible de su código (.tar.bz2, .zip, .jar o lo que sea apropiado). Si está utilizando las herramientas automáticas GNU o los sistemas MakeMaker de Perl, creo que esto existe para usted automáticamente. Si no, recomiendo agregarlo.
ETA (2012-09-06): Vaya, votos negativos duros. Todavía creo que es mejor construir sus distribuciones con sus herramientas de construcción en lugar de su herramienta de control de código fuente. Creo en la construcción de artefactos con herramientas de construcción. En mi trabajo actual, nuestro producto principal está construido con un objetivo de hormigas. Estamos en medio de cambiar los sistemas de control de código fuente, y la presencia de este objetivo de hormigas significa una molestia menos en la migración.
fuente
Esto copiará los archivos en un rango de confirmaciones (C a G) en un archivo tar. Nota: esto solo confirmará los archivos. No todo el repositorio. Ligeramente modificado desde aquí
Ejemplo de historial de confirmación
A -> B -> C -> D -> E -> F -> G -> H -> I
Página del manual de git-diff-tree
-r -> recurse en subárboles
--no-commit-id -> git diff-tree genera una línea con el ID de confirmación cuando corresponde. Esta bandera suprimió la salida de ID de confirmación.
--name-only -> Muestra solo los nombres de los archivos modificados.
--diff-filter = ACMRT -> Seleccione solo estos archivos. Vea aquí la lista completa de archivos
C..G -> Archivos en este rango de confirmaciones
C ~ -> Incluir archivos de Commit C. No solo archivos desde Commit C.
El | xargs tar -rf myTarFile -> salidas a tar
fuente
Según entiendo la pregunta, se trata más de descargar solo cierto estado del servidor, sin historial y sin datos de otras ramas, en lugar de extraer un estado de un repositorio local (como lo hacen muchas respuestas aquí).
Eso se puede hacer así:
--single-branch
está disponible desde Git 1.7.10 (abril de 2012).--depth
es (¿fue?) supuestamente defectuoso, pero para el caso de una exportación, los problemas mencionados no deberían importar.fuente
--depth
, lo que implica a--single-branch
menos que--no-single-branch
se dé, lo que significa que probablemente tenga el mismo efecto. Sin embargo, no estoy seguro, ¿algún experto puede confirmarlo?Necesitaba esto para un script de implementación y no podía usar ninguno de los enfoques mencionados anteriormente. En cambio, descubrí una solución diferente:
fuente
mkdir -p "$2" && git --git-dir="$1" archive HEAD | tar -x -C "$2"
pero algo más largo sin aliento.Haciéndolo de manera fácil, esta es una función para .bash_profile, descomprime directamente el archivo en la ubicación actual, configura primero tu [url: ruta] habitual. NOTA: Con esta función evita la operación de clonación, se obtiene directamente del repositorio remoto.
Alias para .gitconfig, se requiere la misma configuración (TENGA CUIDADO al ejecutar el comando dentro de los proyectos .git, SIEMPRE salta al directorio base anteriormente como se dijo aquí , hasta que esto se arregle, personalmente prefiero la función
fuente
Con mucho, la forma más fácil que he visto de hacerlo (y también funciona en Windows) es
git bundle
:git bundle create /some/bundle/path.bundle --all
Consulte esta respuesta para obtener más detalles: ¿Cómo puedo copiar mi repositorio git de mi máquina Windows a una máquina Linux a través de una unidad USB?
fuente
git bundle
incluye la.git
carpeta, que es lo que el OP no quiere;git archive
parece la forma más apropiada--all
switch?Tengo otra solución que funciona bien si tiene una copia local del repositorio en la máquina donde desea crear la exportación. En este caso, muévase a este directorio de repositorio e ingrese este comando:
GIT_WORK_TREE=outputdirectory git checkout -f
Esto es particularmente útil si administra un sitio web con un repositorio de git y desea obtener una versión limpia
/var/www/
. En este caso, agregue este comando en un.git/hooks/post-receive
script (hooks/post-receive
en un repositorio simple , que es más adecuado en esta situación)fuente
Creo que la publicación de @Aredridel fue la más cercana, pero hay un poco más de eso, así que agregaré esto aquí; la cosa es, en
svn
, si estás en una subcarpeta de un repositorio, y haces:luego
svn
exportará todos los archivos que están bajo control de revisión (también podrían haber agregado recientemente; o estado modificado), y si tiene otra "basura" en ese directorio (y no estoy contando.svn
subcarpetas aquí, sino cosas visibles como.o
archivos) , no se exportará; solo se exportarán los archivos registrados por el repositorio SVN. Para mí, algo bueno es que esta exportación también incluye archivos con cambios locales que aún no se han confirmado; y otra cosa buena es que las marcas de tiempo de los archivos exportados son las mismas que las originales. O, comosvn help export
dice:Para darse cuenta de que
git
no conservará las marcas de tiempo, compare la salida de estos comandos (en una subcarpeta de ungit
repositorio de su elección):... y:
... y, en cualquier caso, ¡me doy cuenta de que
git archive
todas las marcas de tiempo del archivo archivado son las mismas!git help archive
dice:... pero aparentemente ambos casos establecen el "tiempo de modificación de cada archivo"; por lo tanto no conserva las marcas de tiempo reales de esos archivos!
Entonces, para preservar también las marcas de tiempo, aquí hay una
bash
secuencia de comandos, que en realidad es una "línea única", aunque algo complicada, por lo que a continuación se publica en varias líneas:Tenga en cuenta que se supone que está exportando el contenido en el directorio "actual" (arriba
/media/disk/git_svn/subdir
), y que el destino al que está exportando está ubicado de manera algo inconveniente, pero está enDEST
una variable de entorno. Tenga en cuenta que con este script; debes crear elDEST
directorio manualmente usted mismo, antes de ejecutar el script anterior.Después de ejecutar el script, debería poder comparar:
... y espero ver las mismas marcas de tiempo (para aquellos archivos que estaban bajo control de versiones).
Espero que esto ayude a alguien,
¡salud!
fuente
una exportación de git a un archivo zip al agregar un prefijo (por ejemplo, nombre de directorio):
fuente
Si también necesita submódulos, este debería ser el truco: https://github.com/meitar/git-archive-all.sh/wiki
fuente
Tengo la siguiente función de utilidad en mi archivo .bashrc: crea un archivo de la rama actual en un repositorio git.
fuente