2010-03-11 18 views
104

Tengo un proyecto con git, y solo quiero clonar o extraer un directorio específico, como myproject/javascript como lo hace subversion.
hacer algunos cambios, confirmar y volver a presionar.
¿Es posible?Cómo extraer el directorio específico con git

+3

checkout disperso puede interesarle (aunque aún necesita recuperar todo): vea http://stackoverflow.com/questions/2416815/how-to-git-pull-all-but-one-folder/2416991# 2416991 – VonC

Respuesta

143
  1. CD en la parte superior de su copia de recompra
  2. git fetch
  3. git checkout HEAD path/to/your/dir/or/file

    • Donde "path/..." en (3) se inicia en el directorio justo por debajo de la raíz de recompra que contiene su ".../file"
+2

Esta es la respuesta ... ¡gracias! – Paul

+1

Acabo de darme cuenta de que entendí mal la pregunta. Mi respuesta, en cambio, aborda la forma de verificar un solo archivo, que luego se puede modificar y confirmar. – vergueishon

+0

Has abordado el título de la pregunta, que es lo suficientemente bueno. Esto me acaba de salvar, así que, en lo que a mí respecta, esta es la respuesta correcta, especialmente porque este fue un éxito en Google para este problema. – Morgon

15

No es posible. Necesitas sacar todo el repositorio o nada.

+1

A pesar de que necesita * buscar * todo, ¿podría ser de interés un tirón en un árbol de trabajo de pago disperso en este caso? Consulte http://stackoverflow.com/questions/2416815/how-to-git-pull-all-but-one-folder/2416991#2416991 – VonC

+10

Solo para agregar esto, la razón por la que no puede extraer solo un directorio es porque git utiliza seguimiento semántico de datos, no seguimiento semántico de archivos, por lo que puede mover código (u otros datos) sin problemas dentro y fuera de los archivos sin tener que decirle al sistema de seguimiento de origen (hasta que actualice, por supuesto). Debido a esto, el código se puede mover dentro y fuera de directorios sin problemas también, por lo que agarrar solo un directorio no tiene mucho sentido. Espero que esto ayude. – OmnipotentEntity

+0

La respuesta de vergueishon a continuación funcionó para mí. – Paul

-1

Shingara tiene razón. Una explicación de este comportamiento se da en this mailing list thread. Si realmente quiere hacer esto, puede hacer que el directorio javascript sea un submódulo.

+3

No respondió la pregunta en su comentario, proporcionó un enlace. Si el enlace alguna vez se apaga, su enlace es inútil, como es su respuesta. Además, lo que está en el enlace no es muy conciso y fácil de leer. Su respuesta sería útil si resumió o simplificó lo que estaba en el enlace. – leetNightshade

0

A veces, solo quiere echar un vistazo a las copias anteriores de los archivos sin la molestia de pasar por los diffs.

En tal caso, es tan fácil hacer un clon de un repositorio y verificar la confirmación específica que le interesa y echar un vistazo al subdirectorio en ese depósito clonado. Como todo es local, puede eliminar este clon cuando haya terminado.

4

Ya veo. Trataré de crear submódulos y ver si funciona para mí. Informaré los resultados. EDITAR: análisis y submódulos dispersos funcionó para mí.Los enlaces que he usado para leer acerca de (dada por VonC y Michel Jansen) son:

How to git-pull all but one folder

http://www.kernel.org/pub/software/scm/git/docs/git-read-tree.html#_sparse_checkout

http://vmiklos.hu/blog/sparse-checkout-example-in-git-1-7

http://www.kernel.org/pub/software/scm/git/docs/git-read-tree.html#_sparse_checkout

git submodule update

+0

La función de submódulo de git no está particularmente bien implementada. Pueden ser muy incómodos y confusos para trabajar. Personalmente, me mantendría alejado de los submódulos de Git hasta que todos los problemas se hayan solucionado. – user2268788

7

Quizás este comando puede ser útil:

git archive --remote=MyRemoteGitRepo --format=tar BranchName_or_commit path/to/your/dir/or/file > files.tar 

"Et voilà"

+2

Esto descarga un directorio específico de archivos para fines de archivo, esto no extrae una copia que pueda modificar y rechazar. – leetNightshade

46

En un directorio vacío:

git init 
git remote add [REMOTE_NAME] [GIT_URL] 
git fetch REMOTE_NAME 
git checkout REMOTE_NAME/BRANCH -- path/to/directory 
+5

Esto funcionó para mí cuando la respuesta aceptada no. –

+4

Esta es la respuesta correcta para el OP. –

+0

esto funciona si solo quieres usar la versión remota de un archivo para reemplazar el archivo local, creo que – John

8

Después de mucho buscar una respuesta, al no encontrar, renunciar, intentarlo de nuevo y así sucesivamente, finalmente encontró una solución a esto en otro hilo SO:

How to git-pull all but one folder

copiar y pegar lo que hay:

git init 
git remote add -f origin <url> 
git config core.sparsecheckout true 
echo <dir1>/ >> .git/info/sparse-checkout 
echo <dir2>/ >> .git/info/sparse-checkout 
echo <dir3>/ >> .git/info/sparse-checkout 
git pull origin master 

Para hacer lo que OP quiere (trabajar en un solo directorio), simplemente agregue ese directorio a .git/info/sparse-checkout, siguiendo los pasos anteriores.

Muchas gracias a @cforbish!

+2

lo estoy publicando aquí principalmente porque cada vez que intento googlear cómo hacerlo, este es un resultado superior, y ese hilo es ni siquiera cerca de ser exhibido. :(Me siento mal al copiar y pegar, pero creo que son las mejores prácticas de SO? – msb

Cuestiones relacionadas