2010-03-05 27 views
37

Quiero agregar un directorio externo a un repositorio existente.git: ¿Cómo se agrega un directorio externo al repositorio?

Dir externa: /home/some/directorio

Dir de Trabajo: /htdocs/.git

Si intento el siguiente comando desde el directorio/htdocs:

git add /home/some/directory

Aparece un error: fatal: '/ home/some/directory' está fuera del repositorio

+0

¿Qué es lo que realmente quieres? Para mí, parece que quieres algo en tu repositorio, pero no en tu repositorio. – jdizzle

+0

¿El propio directorio externo es un repositorio que también desea fusionar registros? – saeedgnu

+1

ver http://stackoverflow.com/questions/6392862/git-stash-worktree-woes – basZero

Respuesta

-3

Agregue un enlace simbólico a th e directorio dentro del repositorio. Luego, agrega lo mismo.

ln -s /home/some/directory/ 
git add directory 
+4

Pero esto en realidad no rastrea nada en el directorio de destino. Simplemente rastrea el enlace. –

+0

Entonces, ¿cómo hago un seguimiento recursivo de todo bajo el dir de destino? –

+0

Simplemente rastrea el enlace como dice la respuesta anterior, si alguien más clona repo recibe un enlace apuntando a 'en ninguna parte' (o peor aún, 'en alguna parte'). – AoeAoe

41

Si necesito hacer algo así que normalmente me movería ese archivo o directorio externo en mi repositorio git y enlazar simbólicamente su ubicación original a la nueva.

mv /home/some/directory /htdocs/directory 
ln -s /htdocs/directory /home/some/ 
git add ./directory 

utilizo esta técnica cuando estoy desarrollando un plug-in para una aplicación que quiero mantener bajo control de versiones, pero tienen que almacenar en un lugar específico.

+2

nice workaround :) – AoeAoe

+1

Esto no funciona en absoluto para mí en Mac OS X 10.10.3. Básicamente, Wordpress no reconoce el directorio ni los archivos del complemento enlazado y no aparecen en la lista de complementos de WP. ¿Me estoy perdiendo de algo? –

7

Hay una solución realmente simple para esto.

Digamos que eres Git-repo en/var/data/my-app y quieres agregar/var/data/public/a ese repositorio. No puede usar 'agregar' porque Git no agregará recursos fuera del directorio raíz del repositorio. Así que ..

Solución:

  1. Mover el directorio/var/datos// pública directorio en la raíz de su Git-repo (/ var/datos/mi-app).

  2. Crear un sym-link (enlace simbólico) dentro de/var/datos/pública a la carpeta/var/datos/mi-app/pública, usando: ln -s source_file_or_directory virtual_file_or_directory

A continuación, sólo tiene que añadir el archivo o directorio movido a Git usando git add en la forma normal. ¡Su control de fuente Git ahora está rastreando el archivo/carpeta deseado, y su sym-link en el directorio externo asegura que el archivo/carpeta sea accesible a cualquier otra cosa!

+1

esto no rastrea nada en el directorio de destino. Simplemente rastrea el enlace. ¿Derecha? – incandescentman

+0

@PeterSalazar no, ya que Stormbytes sugirió mover el directorio de destino al repositorio de git. El enlace simbólico mantiene la ubicación original. Si agregó el enlace en el repositorio, estaría en lo correcto. – shiri

+0

Esto no funcionará bien si hay varios usuarios que usan la misma máquina y contribuyen al mismo proyecto de git. Ejemplo: Supongamos que hay dos usuarios en la misma máquina: U y T. U vincula simbólicamente el directorio _/var/linked_ a algún lugar dentro de su carpeta de inicio. Otro usuario T quiere editar algunos archivos dentro del directorio _/var/linked_, pero tiene que tener permisos para ello. Incluso si T tiene permiso de escritura para el directorio vinculado de U, T editará la copia de trabajo del repositorio de U. – gagallo7

12
git --work-tree=/ add /home/some/directory 
+8

¿Alguna explicación de por qué funciona esto? – Nightfirecat

+3

Esto lo explica un poco: http://stackoverflow.com/questions/5283262/what-is-git-work-tree-why-have-i-never-needed-to-set-this-env-var-why -ahora aunque no está claro para mí lo que alguien obtendría si clonaran ese repo –

+0

También hace que escribir .gitignore sea muy complicado y el estado de git y git add --a eliminará los archivos fuera del directorio de trabajo de git. Puede establecer el directorio de trabajo como una configuración de repositorio local, pero eso supervisará de manera predeterminada todo lo que se encuentre debajo del directorio establecido. Lo cual requeriría nuevamente la ayuda de gitignore. Más problemas de los que vale. –

13

Tuve el mismo error ... Busqué en Google la muerte ... no salió mucho.

respuesta de Christian trabajó:

git --work-tree=/ add /home/some/directory 

Pero entonces el "trabajo-árbol" me consiguió ir. Completé todos los documentos de Git y obtuve core.worktree.

que utilizan

git config --global core.worktree/

y listo! Ahora puedo agregar de cualquier directorio en el sistema. No sé si causará problemas en otros lugares, pero intentaré actualizar a medida que avanzo.

+1

¿quiso escribir "Ahora puedo agregar desde * cualquier * directorio en el sistema"? Solo curiosidad, el editor de copias en mí quiere editar tu respuesta, oh, tan mal. : P –

+1

Sí lo hice, eso es lo que hace un caso leve de dislexia para usted ... su cerebro ya ha terminado el párrafo y está haciendo otra cosa mientras sus dedos aún están en el medio. (Disculpa la respuesta tardía) – MotherDawg

+0

Así que no puedo hacer 'git add *': P – Nishant

0

O puede utilizar el submódulo si desea trabajar en diferentes repositorios git (no funciona de esta manera). Prueba 'man git-submodule'.

1

Si el código que desea agregar a su repositorio no es demasiado grande, también puede copiarlo automáticamente en su repositorio cada vez que lo presione.

En mi caso, por ejemplo, necesito un archivo R, que modifico con bastante frecuencia, en varios repositorios y escribí un pequeño script de shell:

#!/usr/bin/env bash 

cp -r /some/directory/file.R . 
git add . 
git commit -m "add" 
git push 

... y corro esta secuencia de comandos con el fin de presione todos los cambios, incluidos los que están en/some/directory.

Cuestiones relacionadas