Tengo mi repositorio Git que, en la raíz, tiene dos subdirectorios:
/finisht
/static
Cuando esto estaba en SVN , /finisht
se desprotegió en un lugar, mientras /static
se desprotegió en otro lugar, así:
svn co svn+ssh://[email protected]/home/admin/repos/finisht/static static
¿Hay alguna manera de hacer esto con Git?
git
repository
subdirectory
git-clone
sparse-checkout
Nick Sergeant
fuente
fuente
git clone
comando más simple? Usé esta respuesta simple . Si hay algo más simple, por favor comenteRespuestas:
EDITAR : a partir de Git 2.19, esto finalmente es posible, como se puede ver en esta respuesta .
Considere votar esa respuesta.
Nota: en Git 2.19, solo se implementa el soporte del lado del cliente, todavía falta el soporte del lado del servidor, por lo que solo funciona al clonar repositorios locales. También tenga en cuenta que los servidores Git grandes, por ejemplo, GitHub, en realidad no usan el servidor Git, sino que usan su propia implementación, por lo que incluso si el soporte aparece en el servidor Git, no significa automáticamente que funcione en los servidores Git. (OTOH, dado que no usan el servidor Git, podrían implementarlo más rápido en sus propias implementaciones antes de que aparezca en el servidor Git).
No, eso no es posible en Git.
Implementar algo como esto en Git sería un esfuerzo sustancial y significaría que la integridad del repositorio del cliente ya no podría garantizarse. Si está interesado, busque discusiones sobre "clon disperso" y "búsqueda dispersa" en la lista de correo de git.
En general, el consenso en la comunidad Git es que si tiene varios directorios que siempre se verifican de forma independiente, entonces estos son realmente dos proyectos diferentes y deberían vivir en dos repositorios diferentes. Puedes volver a pegarlos usando Git Submodules .
fuente
git-read-tree
, mucho despuésget-fetch
. La pregunta no era solo verificar un subdirectorio, sino clonar solo un subdirectorio. No veo cómo los pagos escasos podrían hacer eso, ya que segit-read-tree
ejecuta después de que el clon ya se haya completado.Lo que está tratando de hacer se llama un pago escaso , y esa característica se agregó en git 1.7.0 (febrero de 2012). Los pasos para hacer un clon escaso son los siguientes:
Esto crea un repositorio vacío con su control remoto y recupera todos los objetos, pero no los extrae. Entonces hazlo:
Ahora debe definir qué archivos / carpetas desea verificar realmente. Esto se hace enumerándolos en
.git/info/sparse-checkout
, por ejemplo:Por último, pero no menos importante, actualice su repositorio vacío con el estado del control remoto:
Ahora tendrá archivos "desprotegidos" para
some/dir
yanother/sub/tree
en su sistema de archivos (con esas rutas aún), y no hay otras rutas presentes.Es posible que desee echar un vistazo al tutorial extendido y probablemente debería leer la documentación oficial para un pago escaso .
Como una función:
Uso:
Tenga en cuenta que esto seguirá descargando todo el repositorio del servidor, solo que el pago se reduce en tamaño. Por el momento no es posible clonar un solo directorio. Pero si no necesita el historial del repositorio, al menos puede ahorrar en ancho de banda creando un clon superficial. Ver la respuesta de udondan a continuación para obtener información sobre cómo combinar clones poco profundos y pago escaso.
A partir de git 2.25.0 (enero de 2020), se agrega un comando experimental de comprobación escasa en git:
fuente
https://github.com/Umkus/nginx-boilerplate/tree/master/src
derecha en/etc/nginx
git remote add
comando no implica una búsqueda, perogit remote add -f
, como se usa aquí, ¡sí! Eso es lo que-f
significa.--depth=1
cloné Chromium Devtools en 338 MB en lugar de 4.9 GB de Blink source + history. Excelente.git clone --filter
de Git 2.19Esta opción realmente omitirá la búsqueda de objetos innecesarios del servidor. También incluido
--filter=tree:0
desde Git 2.20 y el--filter=combine
filtro compuesto agregado en Git 2.24, terminamos con:El servidor debe configurarse con:
Se realizó una extensión al protocolo remoto Git para admitir esta función en
v2.19.0
y omitir la búsqueda de objetos innecesarios, pero no hay soporte de servidor en ese momento. Pero ya se puede probar localmente.Desglose de comandos:
--filter=blob:none
omite todos los blobs, pero aún recupera todos los objetos del árbol--filter=tree:0
omite los árboles innecesarios: https://www.spinics.net/lists/git/msg342006.html--depth 1
ya implica--single-branch
, vea también: ¿Cómo clono una sola rama en Git?file://$(path)
se requiere para superargit clone
travesuras de protocolo: ¿Cómo clonar superficialmente un repositorio git local con una ruta relativa?--filter=combine:FILTER1+FILTER2
es la sintaxis para usar varios filtros a la vez, intentar pasar--filter
por alguna razón falla con: "no se pueden combinar múltiples especificaciones de filtro". Esto se agregó en Git 2.24 en e987df5fe62b8b29be4cdcdeb3704681ada2b29e "lista-objetos-filtro: implementar filtros compuestos"El formato de
--filter
está documentado enman git-rev-list
.Documentos en el árbol de Git:
Pruébalo
GitHub aguas arriba .
Salida en Git v2.19.0:
Conclusiones:
d1/
faltan todos los blobs externos . Por ejemplo0975df9b39e23c15f63db194df7f45c76528bccb
, qued2/b
no está allí después de la salidad1/a
.Tenga en cuenta que
root/root
ymybranch/mybranch
también faltan, pero lo--depth 1
oculta de la lista de archivos faltantes. Si elimina--depth 1
, se muestran en la lista de archivos faltantes.Tengo un sueño
Esta característica podría revolucionar a Git.
Imagine tener todo el código base de su empresa en un único repositorio sin herramientas desagradables de terceros como
repo
.Imagine almacenar grandes blobs directamente en el repositorio sin ninguna extensión fea de terceros .
Imagínese si GitHub permitiría metadatos por archivo / directorio como estrellas y permisos, para que pueda almacenar todas sus cosas personales en un solo repositorio.
Imagine si los submódulos se trataran exactamente como directorios normales : solo solicite un SHA en árbol y un mecanismo similar a DNS resuelve su solicitud , primero buscando en su servidor local
~/.git
, luego primero en servidores más cercanos (espejo / caché de su empresa) y terminando en GitHub.fuente
fatal: invalid filter-spec 'combine:blob:none+tree:0'
¡Gracias de cualquier manera! Tal vez funcione con versiones más nuevas.Puede combinar el pago escaso y el características de clon superficial . El clon superficial corta el historial y el escaso pago solo extrae los archivos que coinciden con sus patrones.
Necesitará un mínimo de 1.9 git para que esto funcione. Lo probé solo con 2.2.0 y 2.2.2.
De esta manera, todavía podrás empujar , lo que no es posible con
git archive
.fuente
git pull --depth=1 origin master
perogit pull --depth=1 origin <any-other-branch>
. esto es tan extraño, mira mi pregunta aquí: stackoverflow.com/questions/35820630/…Para otros usuarios que solo desean descargar un archivo / carpeta de github, simplemente use:
p.ej
(sí, eso es svn aquí. aparentemente en 2016 todavía necesita svn para simplemente descargar algunos archivos github)
Cortesía: descargue una sola carpeta o directorio de un repositorio de GitHub
Importante : asegúrese de actualizar la URL de Github y reemplazar
/tree/master/
con '/ trunk /'.Como script bash:
Nota: Este método descarga una carpeta, no la clona / desprotege. No puede enviar los cambios nuevamente al repositorio. Por otro lado, esto da como resultado una descarga más pequeña en comparación con el pago escaso o el pago superficial.
fuente
https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/trunk/udacity
pero obtuve unsvn: E170000: URL 'https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/trunk/udacity' doesn't exist
error :(Si nunca planea interactuar con el repositorio desde el que clonó, puede hacer un clon git completo y reescribir su repositorio usando git filter-branch --subdirectory-filter . De esta manera, al menos se preservará la historia.
fuente
git filter-branch --subdirectory-filter <subdirectory>
git clone https://github.com/your/repo_xx.git && cd repo_xx && git filter-branch --subdirectory-filter repo_xx_subdir
Esto parece mucho más simple:
fuente
svn export
en su lugarGit 1.7.0 tiene "pagos escasos". Ver “core.sparseCheckout” en el git config página de manual , “checkout escasa” en el GIT lectura árbol página de manual , y “poco Skip-worktree” en el git-actualización de índice de página de manual .
La interfaz no es tan conveniente como la SVN (por ejemplo, no hay forma de hacer un pago escaso en el momento de un clon inicial), pero la funcionalidad básica sobre la cual se podrían construir interfaces más simples ahora está disponible.
fuente
No es posible clonar el subdirectorio solo con Git, pero a continuación hay algunas soluciones alternativas.
Filtrar rama
Es posible que desee volver a escribir el repositorio para que se vea como si
trunk/public_html/
hubiera sido la raíz del proyecto, y descartar el resto del historial (usandofilter-branch
), intente ya en la rama de pago:Notas: El
--
que separa las opciones de rama de filtro de las opciones de revisión, y el--all
para reescribir todas las ramas y etiquetas. Toda la información incluida originales cometer veces o información de combinación será preservada . Este comando honra el.git/info/grafts
archivo y las referencias en elrefs/replace/
espacio de nombres, por lo que si tiene algún injerto o reemplazorefs
definido, ejecutar este comando los hará permanentes.Pago escaso
Aquí hay pasos simples con un enfoque de pago escaso que llenará el directorio de trabajo de manera dispersa, por lo que puede decirle a Git qué carpeta (s) o archivo (s) en el directorio de trabajo vale la pena revisar.
Clonar el repositorio como de costumbre (
--no-checkout
es opcional):Puede omitir este paso, si ya tiene su repositorio clonado.
Sugerencia: Para repositorios grandes, considere clonar superficial (
--depth 1
) para pagar solo la última revisión o / y--single-branch
solo.Habilitar
sparseCheckout
opción:Especifique la (s) carpeta (s) para el pago escaso ( sin espacio al final):
o editar
.git/info/sparse-checkout
.Verifique la sucursal (por ejemplo
master
):Ahora debería haber seleccionado carpetas en su directorio actual.
Puede considerar enlaces simbólicos si tiene demasiados niveles de directorios o rama de filtrado.
fuente
pull
?filter-branch
volvería a escribir las confirmaciones principales para que tengan diferentes ID SHA1 y, por lo tanto, su árbol filtrado no tendría confirmaciones en común con el árbol remoto.git pull
no sabría de dónde tratar de fusionarnos.Acabo de escribir un guión para GitHub .
Uso:
fuente
Esto clonará una carpeta específica y eliminará todo el historial que no esté relacionado con ella.
fuente
Aquí hay una secuencia de comandos de shell que escribí para el caso de uso de un único subdirectorio
coSubDir.sh
fuente
ln -s ./.$localRepo/$subDir $localRepo
lugar deln -s ./.$localRepo$subDir $localRepo
Escribí un
.gitconfig
[alias]
para realizar un "pago escaso". Compruébalo (sin juego de palabras):En Windows ejecuta en
cmd.exe
De otra manera:
Uso :
Los
git config
comandos se 'minifican' para mayor comodidad y almacenamiento, pero aquí está el alias expandido:fuente
L=${1##*/} L=${L%.git}
? ¿Es el espacio un operador?¿Usando Linux? ¿Y solo quiere un árbol de trabajo de fácil acceso y limpieza? sin molestar el resto del código en su máquina. prueba los enlaces simbólicos !
Prueba
fuente
Solo para aclarar algunas de las excelentes respuestas aquí, los pasos descritos en muchas de las respuestas suponen que ya tiene un repositorio remoto en alguna parte.
Dado: un repositorio git existente, por ejemplo
[email protected]:some-user/full-repo.git
, con uno o más directorios que desea extraer independientemente del resto del repositorio, por ejemplo, los directorios nombradosapp1
yapp2
Suponiendo que tiene un repositorio git como el anterior ...
Luego: puede ejecutar pasos como los siguientes para extraer solo directorios específicos de ese repositorio más grande:
Pensé erróneamente que las opciones de pago escaso tenían que establecerse en el repositorio original: este no es el caso. Usted define qué directorios desea localmente, antes de extraerlos del control remoto. Espero que esta aclaración ayude a alguien más.
fuente
Si bien odio tener que usar svn cuando trato con repositorios git: / Lo uso todo el tiempo;
Esto le permite copiar desde la url de github sin modificación. Uso;
fuente
Si realmente está interesado en los últimos archivos de revisión de un directorio, Github le permite descargar un repositorio como archivo Zip, que no contiene historial. Entonces la descarga es mucho más rápida.
fuente
Así que intenté todo en esta banda y nada funcionó para mí ... Resulta que en la versión 2.24 de Git (la que viene con cpanel en el momento de esta respuesta), no es necesario que hagas esto
todo lo que necesitas es el nombre de la carpeta
En resumen, haces esto
luego edita .git / info / sparse-checkout y agrega los nombres de carpeta (uno por línea) con / * al final para obtener subcarpetas y archivos
Guarde y ejecute el comando de pago
El resultado fue la carpeta esperada de mi repositorio y nada más Upvote si esto funcionó para usted
fuente