Quiero usar algo similar a:
git checkout -- <path>/<file>
pero quiero download el file en la carpeta que elija, en lugar de sobrescribir el / local.
¿Alguna idea?
Como hacer un "git export" (como "svn export")?
Puedes usar git checkout-index
para eso, este es un command de bajo nivel, si quieres exportar todo, puedes usar -a
,
git checkout-index -a -f --prefix=/destination/path/
Para citar las páginas man:
El final "/" [en el prefijo] es importante. El nombre exportado literalmente solo tiene el prefijo con la cadena especificada.
Si desea exportar un determinado directory, hay algunos trucos involucrados. El command solo toma files, no directorys. Para aplicarlo a directorys, use el command 'search' y canalice la salida a git.
find dirname -print0 | git checkout-index --prefix=/path-to/dest/ -f -z --stdin
También desde las páginas man:
La intuición no es el objective aquí. Repetitividad es.
Otra solución que es un poco más limpia: simplemente especifique un tree de trabajo diferente.
Para pagar todo desde su HEAD (no índice) a un directory de salida específico:
git --work-tree=/path/to/outputdir checkout HEAD -- .
Para pagar un subdirectory o file de su HEAD a un directory específico:
git --work-tree=/path/to/outputdir checkout HEAD -- subdirname
Para un solo file:
git show HEAD:abspath/to/file > file.copy
Las soluciones anteriores no me funcionaron porque necesitaba verificar una versión labelda específica del tree. Así es como se supone que se use la cvs export
, por cierto. git checkout-index
no toma el argumento tag, ya que verifica los files desde el índice. git checkout <tag>
cambiaría el índice independientemente del tree de trabajo, por lo que tendría que restablecer el tree original. La solución que funcionó para mí fue clonar el repository. El clon compartido es bastante rápido y no ocupa mucho espacio extra. El directory .git
se puede eliminar si lo desea.
git clone --shanetworking --no-checkout <repository> <destination> cd <destination> git checkout <tag> rm -rf .git
Las versiones más nuevas de git deberían ser compatibles con git clone --branch <tag>
para verificar la label especificada automáticamente:
git clone --shanetworking --branch <tag> <repository> <destination> rm -rf <destination>/.git
Si trabajas con tu característica y no deseas volver a la configuration maestra, puedes ejecutar:
git worktree add ../myrepo_master master
../myrepo_master
directory ../myrepo_master
con commit de la twig master
, donde puede continuar trabajando
La respuesta de Adrian arrojó "fatal: esta operación debe ejecutarse en un tree de trabajo". Lo siguiente es lo que funcionó para nosotros.
git worktree add <new-dir> --no-checkout --detach cd <new-dir> git checkout <some-ref> -- <existing-dir>
Notas:
--no-checkout
No pague nada en el nuevo worktree. --detach
No --detach
una nueva twig para el nuevo tree de trabajo. <some-ref>
funciona con cualquier reference, por ejemplo, funciona con HEAD~1
. git worktree prune
. Definí un alias de git para lograr exactamente esto (antes de encontrar esta pregunta).
Es una function corta bash que guarda la ruta actual, cambia al repository git, realiza un pago y regresa donde comenzó.
git checkto develop ~ / my_project_git
Esto, por ejemplo, verificaría la twig de desarrollo en el directory "~ / my_project_git".
Este es el código de alias dentro de ~/.gitconfig
:
[alias] checkTo = "!f(){ [ -z \"$1\" ] && echo \"Need to specify branch.\" && \ exit 1; [ -z \"$2\" ] && echo \"Need to specify target\ dir\" && exit 2; cDir=\"$(pwd)\"; cd \"$2\"; \ git checkout \"$1\"; cd \"$cDir\"; };f"