2010-10-12 10 views
9

Disculpa si es un duplicado, he buscado en Google y SO y no he podido encontrar nada similar, ¡ya que es un conjunto bastante genérico de palabras para buscar!Repositorio de Git con el directorio de git almacenado en otra parte

Lo que quiero es que el directorio .git esté fuera del árbol de trabajo.

Necesito hacer esto porque es un repositorio git 'sigiloso' dentro de un proyecto que usa otro software de control de versiones, y desafortunadamente la forma en que está configurado es con múltiples proyectos (que quiero que sean un repositorio git) un directorio raíz y con scripts de construcción que les gusta depurar archivos de los directorios del proyecto. Hasta ahora he estado versionando el directorio raíz e ignorando todos los otros directorios de proyectos, por lo que uno de los proyectos fue versionado, pero ahora quiero versionar otro proyecto y claramente no puedo tener múltiples repositorios git en el directorio raíz (o puedo ? Esa sería una buena respuesta alternativa). Poner los directorios .git en otro lugar en el disco sería una buena solución, si es posible.

+1

¿No puede configurar el otro software de control de versiones para ignorar ese directorio .git? ¿Cuál es el otro VCS? – Vinzenz

+0

Sí, simplifiqué un poco por el bien de la pregunta. En realidad, es parte de nuestras otras herramientas y proceso de creación que le gusta purgar cosas; aunque puedo hacer que el VCS ignore el directorio .git, desafortunadamente no puedo hacer eso con estas otras herramientas (y no puedo modificarlas para permitir eso). –

+0

Lo siento, se olvidó de decir: el VCS es ... no es normal. Supongamos que es propiedad. –

Respuesta

8

Puede especificar la ruta al repositorio de git de forma explícita con la opción global --git-dir para todos los comandos de git. Cuando utiliza esta opción con init, generalmente crea un repositorio vacío, pero si también proporciona --work-tree, puede inicializar un repositorio no vacío con un árbol de trabajo 'separado'.

git --git-dir=/var/repo/one.git --work-tree=/var/work/one init 

A partir de entonces, usted todavía tiene que suministrar, ya sea la opción --git-dir o un conjunto variable de GIT_DIR medio ambiente para que Git sabe dónde está el repositorio es como no hay datos específicos de Git en todo el interior del árbol de trabajo, pero el trabajo tree se determinará apropiadamente desde la configuración del repositorio git.

+0

Similar a las otras respuestas, pero esta establece también el árbol de trabajo, por lo que no es necesario recordar hacer un cd en la raíz cada vez. Aunque he votado a favor de los otros también. ¡Muchas gracias! –

1

Git interopera con varios otros VCS, por lo que esta puede no ser la mejor manera de resolver su problema.

Sin embargo, es posible: usando git-config puede decirle a git que use otro directorio, que no sea el que contiene .git, como la raíz del árbol de trabajo.

Si ejecuta git init un directorio por encima del directorio raíz foo del otro proyecto, entonces se podría usar:

git config core.worktree ../foo 

Dónde ../foo es el camino de la foo proyecto en relación con el directorio de .git.

Sin embargo, con una ruta relativa, las herramientas git solo funcionarán en el directorio principal de foo, no en ningún otro lugar en el árbol. Al usar una ruta absoluta, evita esto (pero debe recordar cambiarlo si alguna vez mueve su proyecto).

+0

Esto también funciona para ** modificar ** el árbol de trabajo después (si lo movió); sin embargo, lo extraño es que el directorio original del árbol de trabajo necesita existir (un dir vacío servirá) – giraff

0

No sé si eso es posible, soy bastante novato en VCSes.

Pero se puede decir a los otros VCS para ignorar los archivos, para hacer un archivo CVS .cvsignore:

.git 
*ignore_me* 

para usar SVN

$ svn propset svn:ignore -F .cvsignore . 

Espero que esto ayude.

1

No estoy muy seguro de si este es un buen consejo, pero puede establecer la variable de entorno GIT_DIR para que apunte a un directorio git no desnudo. Tenga en cuenta que en esta configuración, git no puede encontrar el directorio de trabajo superior, por lo que debe estar seguro de estar en el directorio correcto al emitir los comandos de git.

mkdir foobar 
cd foobar 
git init 
export GIT_DIR=$PWD/.git 
cd .. 
mkdir wc 
cd wc 
echo foo > bar.txt 
git add . 
git commit 
6

Puede enlazar a un gitdir en una ubicación arbitraria mediante la creación de un archivo llamado .git en la raíz del árbol de trabajo, que contiene lo siguiente:

gitdir: <path-to-gitdir> 

Naturalmente es necesario tener trasladó por primera vez el directorio .git original a su ubicación exterior.

Todas las herramientas git de buen comportamiento respetarán esto, sin depender de variables de entorno o mecanismos específicos del sistema operativo, como los enlaces simbólicos. También debería poder colocar estos enlaces en ubicaciones arbitrarias en su jerarquía de directorios, vinculando así a múltiples repositorios.

Por supuesto, tales archivos .git seguirán visibles en el árbol de trabajo, por lo que este enfoque puede no ser aceptable en su caso. Sin embargo, si ese archivo se elimina, es trivial restaurarlo (a diferencia de un directorio .git).

Cuestiones relacionadas