Pregunta

¿Es posible tener 2 repositorios git en un directorio? Pensaría que no, pero pensé en preguntar. Básicamente, me gustaría revisar los archivos de configuración de mi directorio personal (por ejemplo, .emacs) que deberían ser comunes en todas las máquinas en las que trabajo, pero que tienen un segundo repositorio para archivos locales (por ejemplo, .emacs.local), que contiene configuraciones específicas de la máquina. La única forma en que se me ocurre hacer eso es tener la configuración local en un subdirectorio e ignorar ese subdirectorio del repositorio principal de git. ¿Alguna otra idea?

¿Fue útil?

Solución

Si entiendo lo que está haciendo, puede manejarlo todo en un repositorio, utilizando ramas separadas para cada máquina y una rama que contenga sus archivos de configuración del directorio de inicio común.

Inicialice el repositorio y confirme los archivos comunes, quizás cambiando el nombre de la rama MASTER como Común. Luego cree una rama separada desde allí para cada máquina con la que trabaje, y confirme los archivos específicos de la máquina en esa rama. Cada vez que cambie sus archivos comunes, combine la rama común en cada una de las ramas de la máquina y empuje a sus otras máquinas (escriba un script para eso si hay muchas).

Luego, en cada máquina, verifique la rama de esa máquina, que también incluirá los archivos de configuración comunes.

Otros consejos

Este artículo cubre esto relativamente bien:

https://github.com/rrrene/gitscm-next/blob/master/app/views/blog/progit/2010-04-11-environment.markdown

Básicamente, si está trabajando desde la línea de comandos, esto es más simple de lo que puede suponer. Supongamos que quieres 2 repositorios git:

.gitone
.gittwo

Puede configurarlos así:

git init .
mv .git .gitone
git init .
mv .git .gittwo

Puede agregar un archivo y confirmarlo solo en uno así:

git --git-dir=.gitone add test.txt
git --git-dir=.gitone commit -m "Test"

Entonces, las opciones para git vienen primero, luego el comando, luego las opciones del comando git. Fácilmente podría alias un comando git como:

#!/bin/sh
alias gitone='git --git-dir=.gitone'
alias gittwo='git --git-dir=.gittwo'

Para que pueda comprometerse con uno u otro con un poco menos de tipeo, como gitone commit -m " blah " .

Lo que parece ser más complicado es ignorar. Dado que .gitignore normalmente se encuentra en la raíz del proyecto, necesitaría encontrar una manera de cambiar esto también sin cambiar toda la raíz. O bien, puede usar .git / info / exclude, pero todas las ignoraciones que realice no se confirmarán ni se enviarán, lo que podría fastidiar a otros usuarios. Otros que usen cualquiera de los repositorios pueden presionar un .gitignore, lo que puede causar conflictos. No está claro para mí la mejor manera de resolver estos problemas.

Si prefiere herramientas GUI como TortoiseGit, también tendrá algunos desafíos. Podría escribir un pequeño script que cambie el nombre de .gitone o .gittwo a .git temporalmente para que se cumplan los supuestos de estas herramientas.

Eche un vistazo a git submodule .

  

Los submódulos permiten repositorios extranjeros   para ser incrustado dentro de un dedicado   subdirectorio del árbol fuente,   siempre apuntó a una confirmación particular.

RichiH escribió una herramienta llamada vcsh que es una herramienta para administrar archivos de puntos usando repositorios falsos de git para poner más de un directorio de trabajo en $ HOME. Nada que ver con csh AFAIK.

Sin embargo, si tenía varios directorios, una alternativa a los submódulos git (que son una molestia en las mejores circunstancias y este uso de ejemplo no es la mejor de las circunstancias) es gitslave que deja los repositorios de esclavos desprotegidos en la punta de una rama en todo momento y no requiere el proceso de tres pasos para realizar un cambio en el repositorio subsidiario ( pagar en la rama correcta, hacer & amp; confirmar el cambio, luego ir al superproyecto y confirmar el nuevo compromiso del submódulo).

Es posible usando la variable GIT_DIR pero tiene muchas advertencias si no sabe lo que está haciendo.

Sí, los submódulos son probablemente lo que quieres. Otra opción sería tener su copia de trabajo en un subdirectorio y luego apuntar enlaces simbólicos de su directorio de inicio a los archivos de interés.

mi método preferido es usar un repositorio en un subdirectorio y usar enlaces simbólicos recursivos:

git clone repo1
cd somerepo
git clone repo2
cd repo2
./build

donde se ve el archivo ' repo / build ':

#!/bin/bash 
SELF_PATH="$(dirname "$(readlink -f "<*>")" )"  # get current dir 
cd .. && git stash && git clean -f -d ''       # remove previous symlinks
cp -sR "$SELF_PATH"/* ../.                     # create recursive symlinks in root

precaución : no use 'git add'.

La otra opción es crearlos en carpetas separadas y crear enlaces duros simbólicos de una carpeta a otra.

Por ejemplo, si hay repositorios:

  1. Repo1 / FolderA
  2. Repo1 / FolderB

Y:

  1. Repo2 / FolderC

Puede vincular las carpetas FolderA y FolderB del Repo1 al Repo2. Para Windows, el comando para ejecutar en Repo1 sería:

User@Repo1$ mklink /J FullPath/Repo2/FolderA FullPath/Repo1/FolderA
User@Repo1$ mklink /J FullPath/Repo2/FolderB FullPath/Repo1/FolderB
User@Repo1$ printf "/FolderA/*\n/FolderB/*\n" >> .gitignore

Para los archivos en los repositorios principales, necesitaría vincular cada uno de ellos, y también agregarlos al repositorio .gitignore para evitar el ruido, a menos que lo desee.

Descargo de responsabilidad: esto no es publicidad. Soy el desarrollador de la biblioteca proporcionada.

He creado una extensión git para manejar casos en los que desea mezclar múltiples repositorios en una carpeta. La ventaja de la lib es hacer un seguimiento de los repositorios y conflictos de archivos. puede encontrarlo en github . También hay 2 repositorios de ejemplo para probarlo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top