Tengo una idea inusual de usar git como sistema de respaldo. Digamos que tengo un directorio ./backup/myfiles y quiero hacer una copia de seguridad de eso usando git. Para mantener las cosas limpias, no quiero tener un directorio .git en la carpeta myfiles, así que pensé que podría crear ./backup/git_repos/myfiles. Al mirar los documentos de git, he intentado hacer esto:
$ cd backup/myfiles
$ mkdir ../git_repos/myfiles
$ git --git-dir=../git_repos/myfiles init
Initialized empty Git repository in backup/git_repos/myfiles/
$ git --git-dir="../git_repos/myfiles/" add foo
fatal: pathspec 'foo' did not match any files
Puedes ver el mensaje de error que llego allí. ¿Qué estoy haciendo mal?
Respuestas:
Esto hará lo que quieras, pero obviamente apestará cuando tengas que especificarlo con cada comando git que uses.
Puede exportar
GIT_WORK_TREE=.
yGIT_DIR=../backup
Git los recogerá en cada comando. Sin embargo, eso solo le permitirá trabajar cómodamente en un único repositorio por shell.Prefiero sugerir unir el directorio .git a otro lugar, o crear un enlace simbólico al directorio .git desde su directorio principal de respaldo.
fuente
Solo necesita asegurarse de que el repositorio sepa dónde está el árbol de trabajo y viceversa.
Para que el repositorio sepa dónde está el árbol de trabajo, establezca el valor de configuración
core.worktree
. Para que el árbol de trabajo sepa dónde está su directorio git, agregue un archivo llamado .git (¡no una carpeta!) Y agregue una línea comoDesde git 1.7.5 el comando init aprendió una opción adicional para esto.
Puede inicializar un nuevo repositorio separado con
Esto inicializará el repositorio git en el directorio separado y agregará el archivo .git en el directorio actual, que es el directorio de trabajo del nuevo repositorio.
Anteriormente a 1.7.5 tenía que usar parámetros ligeramente diferentes y agregar el archivo .git usted mismo.
Para inicializar un repositorio separado, el siguiente comando vincula el árbol de trabajo con el repositorio:
Su directorio actual será el árbol de trabajo y git usará el repositorio en
/path/to/repo.git
. El comando init establecerá automáticamente elcore.worktree
valor especificado con el--git-dir
parámetro.Incluso podría agregar un alias para esto:
Utilice el control de versiones de git en un directorio de trabajo de solo lectura
Con el conocimiento anterior, incluso puede configurar el control de versión de git para un directorio de trabajo sin tener permisos de escritura. Si usa
--git-dir
en cada comando git o ejecuta cada comando desde el repositorio (en lugar del directorio de trabajo), puede omitir el archivo .git y, por lo tanto, no necesita crear ningún archivo dentro del directorio de trabajo. Ver también respuesta de Leofuente
core.worktree
por supuesto, se almacena en el archivo de configuración de la carpeta .git, donde apunta el archivo .git.fatal: core.worktree and core.bare do not make sense
. Parece que solo cambia la configuración, por lo que no está claro resuelve eso.La
--separate-git-dir
opción paragit init
(ygit clone
) se puede utilizar para lograr esto en mi versión de git (1.7.11.3
). La opción separa el repositorio git del árbol de trabajo y crea un enlace simbólico agnóstico del sistema de archivos git (en la forma de un archivo llamado.git
) en la raíz del árbol de trabajo. Creo que el resultado es idéntico a la respuesta de niks .fuente
init
sí mismo se ve más y más limpiorepo.git
se crea con su conjunto de atributos hiden. Luego lo cambio manualmente. ¿Sabes si esto es seguro?Me resulta más simple revertir los directorios
--work-tree
y--git-dir
utilizados en la respuesta de niks:Este enfoque tiene dos ventajas:
.git
archivos. Simplemente opera normalmente desde la raíz del repositorio.La única advertencia que he encontrado es que en lugar de usar un
.gitignore
archivo, editasinfo/exclude
.Luego puede usar el repositorio
read_only_repos/foo
como un control remoto en sus propios repositorios incluso si los archivos originales no están bajo control de versión.fuente
Es convencional nombrar un directorio que sea un repositorio git que tenga su árbol de trabajo en un lugar inusual con una extensión '.git', muy similar a un repositorio simple.
Si hubiera proporcionado la
--work-tree
opción en el momento de inicio, esto habría configurado automáticamente lacore.worktree
variable de configuración, lo que significa que git sabrá dónde encontrar el árbol de trabajo una vez que especifique el directorio git.Pero también puede establecer esta variable después del hecho.
Una vez que haya hecho esto, el comando agregar debería funcionar como se esperaba.
fuente
Usar
git
dentro del repositorio:De ahora en adelante, puede usar
git
dentro del./backup/git_repos/myfiles
directorio, sin establecer ninguna variable de entorno o parámetros adicionales.fuente
warning: core.bare and core.worktree do not make sense
¿eso significa que no ha funcionado?core.bare
parafalse
después.Puede crear un script "nodgit" (No Dot GIT) con algo como
Puede llamar a nodgit en lugar de git y establecerá las variables según sea necesario buscando un repositorio de git. Por ejemplo, digamos que tiene un repositorio (desnudo) en / usr / local / gits / __ home__foo_wibbles y está en / home / foo / wibbles / one, entonces encontrará el directorio de trabajo correcto (/ home / foo / wibbles) y el repositorio .
Oh, también puede usar "shell nodgit" para obtener un shell con los vars correctos establecidos para que pueda usar comandos git viejos y simples.
fuente
Suponiendo que sus
myfiles
directorios ya existan y tengan algún contenido, ¿podría vivir con esto?El
.git
directorio estará enbackup
, no enmyfiles
.fuente
git
rastrear utilizando el.gitignore
archivo. Si desea añadir*
y!myfiles
a la misma, se realizará un seguimiento únicamente ese directorio. Pero si desea un repositorio separado para otro directorio, tendría un problema ...Creo guiones que se parecen a
~ / bin / git-slash:
Es redundante usar --git_dir = $ GIT_DIR, pero me recuerda que también puedo establecer variables de entorno fuera del script.
El ejemplo anterior es para rastrear cambios locales en los archivos del sistema cygwin.
Puede hacer uno de esos scripts para cualquier proyecto importante que lo necesite, pero / sin /.git es mi uso principal.
Lo anterior es lo suficientemente pequeño como para crear un alias o función de shell, si elimina la redundancia.
Si hago esto con la frecuencia suficiente, reviviría el espacio de trabajo para la asignación de repositorio de
cuya contraparte moderna más cercana es las asignaciones o vistas de Perforce , que admiten pagos parciales, así como la no colocación del espacio de trabajo y el repositorio.
fuente