2010-07-29 10 views
5

La extracción de una gota (archivo) de una revisión arbitraria es fácil con git show, por ejemplo:¿Cuál es la mejor forma de extraer un árbol de un repositorio de git?

git show master:src/hello-world.c > /tmp/hello.c 

Sin embargo, me gustaría saber si hay una manera similar en git para extraer un árbol (directorio) y todo debajo de él recursivamente?

He escrito un pequeño script que hace esto, así que lo agregaré como posible respuesta. Parece que este es el tipo de cosas que bien pueden estar incorporadas en git, pero no sé cómo encontrarlo ...

Respuesta

13

Puedes usar git archive para esto.

git archive master:src/ | tar -C destination -x 
+0

¡Bondad, una respuesta instantánea! Gracias, eso es ideal, mucho más rápido que mi script. –

+1

Una ventaja adicional de esto es que puedes hacerlo de forma remota, contra otro repositorio (incluso vacío) con --remote – cxreg

0

que estoy haciendo esto por el momento con este script:

http://gist.github.com/498447

... el que analiza la salida de git ls-tree -r -z <tree-ish>. Puede pasar cualquier cosa que git ls-tree puede entender como un árbol, por ejemplo:

extract-tree-from-git.py master:src/tests/ /tmp/extracted-tests/ 
extract-tree-from-git.py HEAD^ /tmp/parent-of-head/ 
6

Puede utilizar read-tree y checkout-index con un archivo de índice temporal:

GIT_INDEX_FILE=.tmp.index { git read-tree master:src && 
          git checkout-index -a --prefix=dest/; 
          rm -f .tmp.index; } 

(Los saltos de línea añaden para mayor claridad, pero es . realmente una sola línea)

caso de un repositorio desnudo hay que pretender que existe un árbol de trabajo y que usted está en él:

GIT_INDEX_FILE=.tmp.index GIT_DIR=/path/to/repo.git GIT_WORK_TREE=. { 
    git read-tree master:src && 
    git checkout-index -a --prefix=/path/to/dest/; 
    rm -f .tmp.index; } 

Si se ejecuta desde el interior del repositorio vacío, puede omitir la configuración GIT_DIR.

+0

Inteligente :) ¿Hay alguna razón en particular para preferir esa respuesta a tu respuesta 'archivo git', que no sea dependiente en alquitrán? –

+0

@Mark Longair: este es más 'bajo nivel'; la solución de archivo es más un comando de usuario. No tengo idea si este funciona mejor o peor. Mantuve las respuestas separadas ya que estoy realmente interesado en saber cuál es más popular. –

+0

Como cxreg alude, con un repositorio vacío y git 1.7.0.4 el paso "git checkout-index" falla con "fatal: esta operación debe ejecutarse en un árbol de trabajo". (Esto parece un tanto extraño en el caso de que se establezca GIT_INDEX_FILE y --prefix sea usado, creo.) Por lo tanto, aceptaré la otra respuesta, ya que el caso del repositorio es importante para mí, pero esto es muy útil: gracias por los dos –

Cuestiones relacionadas