git - tag - ¿Cuál es la diferencia práctica entre un repositorio desnudo y no desnudo?
git push tag (9)
5 años tarde, lo sé, pero nadie respondió la pregunta:
Entonces, ¿por qué debería usar el repositorio simple y por qué no? ¿Cuál es la diferencia práctica? Eso no sería beneficioso para más personas trabajando en un proyecto, supongo.
¿Cuáles son sus métodos para este tipo de trabajo? Sugerencias?
Para citar directamente del libro de Loeliger / MCullough (978-1-449-31638-9, p196 / 7):
Un repositorio simple podría parecer de poca utilidad, pero su función es crucial: servir como un punto focal autorizado para el desarrollo colaborativo. Otros desarrolladores
clone
yfetch
del repositorio simple y lepush
actualizaciones ... si configura un repositorio en el que los desarrolladorespush
cambios, debe estar al descubierto. En efecto, este es un caso especial de la mejor práctica general que un repositorio publicado debería estar al descubierto.
He estado leyendo acerca de los repositores desnudos y no-bare / default en Git. No he podido entender bastante bien (teóricamente) las diferencias entre ellos, y por qué debería "presionar" a un repositorio simple. Aquí está el trato:
Actualmente, soy el único que trabaja en un proyecto en 3 computadoras diferentes, pero habrá más personas involucradas más tarde, así que estoy usando Git para el control de versiones. Copio el repositorio desnudo en todas las computadoras, y cuando termino mis modificaciones en una de ellas, confirmo y envío los cambios al repositorio desnudo. Por lo que he leído, el repositorio desnudo NO tiene un "árbol de trabajo", así que si clonoé el repositorio desnudo, no tendré un "árbol de trabajo".
Supongo que el árbol de trabajo almacena la información de compromiso, las ramas, etc. del proyecto. Eso no aparecería en el repositorio desnudo. Por lo tanto, me parece mejor "presionar" los compromisos al repositorio con el árbol de trabajo.
Entonces, ¿por qué debería usar el repositorio simple y por qué no? ¿Cuál es la diferencia práctica? Eso no sería beneficioso para más personas trabajando en un proyecto, supongo.
¿Cuáles son sus métodos para este tipo de trabajo? Sugerencias?
Ciertamente no soy un "experto" de Git. He usado TortoiseGit por un tiempo, y me pregunté de qué estaba hablando cuando me preguntó si quería hacer un repo "al descubierto" cada vez que creaba uno. Estaba leyendo este tutorial: https://www.atlassian.com/git/tutorials/setting-up-a-repository/git-init y aborda el problema, pero todavía no estaba entendiendo el concepto. Éste ayudó mucho: http://bitflop.com/tutorials/git-bare-vs-non-bare-repositories.html . ¡Ahora, el primero también tiene sentido!
De acuerdo con estas fuentes, en pocas palabras, un repo "vacío" se utiliza en un servidor donde desea configurar un punto de distribución. No está diseñado para su uso en su máquina local. Por lo general, envía las confirmaciones desde su máquina local a un repositorio simple en un servidor remoto, y usted y otras personas extraen de ese repositorio desnudo a su máquina local. Entonces, su repositorio de distribución / almacenamiento remoto de GitHub, Assembla, etc. es un ejemplo donde se crea un repositorio "vacío". Haría uno usted mismo si estuviera configurando su propio "centro de intercambio" análogo.
El repositorio no desnudo te permite (en tu árbol de trabajo) capturar los cambios creando nuevos commits.
Los repositorios simples solo se modifican mediante el transporte de cambios desde otros repositorios.
Esta no es una respuesta nueva, pero me ayudó a comprender los diferentes aspectos de las respuestas anteriores (y es demasiado para hacer un comentario).
Usando Git Bash solo intente:
me@pc MINGW64 /c/Test
$ ls -al
total 16
drwxr-xr-x 1 myid 1049089 0 Apr 1 11:35 ./
drwxr-xr-x 1 myid 1049089 0 Apr 1 11:11 ../
me@pc MINGW64 /c/Test
$ git init
Initialized empty Git repository in C:/Test/.git/
me@pc MINGW64 /c/Test (master)
$ ls -al
total 20
drwxr-xr-x 1 myid 1049089 0 Apr 1 11:35 ./
drwxr-xr-x 1 myid 1049089 0 Apr 1 11:11 ../
drwxr-xr-x 1 myid 1049089 0 Apr 1 11:35 .git/
me@pc MINGW64 /c/Test (master)
$ cd .git
me@pc MINGW64 /c/Test/.git (GIT_DIR!)
$ ls -al
total 15
drwxr-xr-x 1 myid 1049089 0 Apr 1 11:35 ./
drwxr-xr-x 1 myid 1049089 0 Apr 1 11:35 ../
-rw-r--r-- 1 myid 1049089 130 Apr 1 11:35 config
-rw-r--r-- 1 myid 1049089 73 Apr 1 11:35 description
-rw-r--r-- 1 myid 1049089 23 Apr 1 11:35 HEAD
drwxr-xr-x 1 myid 1049089 0 Apr 1 11:35 hooks/
drwxr-xr-x 1 myid 1049089 0 Apr 1 11:35 info/
drwxr-xr-x 1 myid 1049089 0 Apr 1 11:35 objects/
drwxr-xr-x 1 myid 1049089 0 Apr 1 11:35 refs/
Lo mismo con git --bare
:
me@pc MINGW64 /c/Test
$ ls -al
total 16
drwxr-xr-x 1 myid 1049089 0 Apr 1 11:36 ./
drwxr-xr-x 1 myid 1049089 0 Apr 1 11:11 ../
me@pc MINGW64 /c/Test
$ git init --bare
Initialized empty Git repository in C:/Test/
me@pc MINGW64 /c/Test (BARE:master)
$ ls -al
total 23
drwxr-xr-x 1 myid 1049089 0 Apr 1 11:36 ./
drwxr-xr-x 1 myid 1049089 0 Apr 1 11:11 ../
-rw-r--r-- 1 myid 1049089 104 Apr 1 11:36 config
-rw-r--r-- 1 myid 1049089 73 Apr 1 11:36 description
-rw-r--r-- 1 myid 1049089 23 Apr 1 11:36 HEAD
drwxr-xr-x 1 myid 1049089 0 Apr 1 11:36 hooks/
drwxr-xr-x 1 myid 1049089 0 Apr 1 11:36 info/
drwxr-xr-x 1 myid 1049089 0 Apr 1 11:36 objects/
La distinción entre un repositorio de Git desnudo y no desnudo es artificial y engañosa ya que un espacio de trabajo no es parte del repositorio y un repositorio no requiere un espacio de trabajo. Estrictamente hablando, un repositorio de Git incluye aquellos objetos que describen el estado del repositorio. Estos objetos pueden existir en cualquier directorio, pero normalmente existen en el directorio .git
en el directorio de nivel superior del espacio de trabajo. El espacio de trabajo es un árbol de directorio que representa un compromiso particular en el repositorio, pero puede existir en cualquier directorio o no existir en absoluto. La variable de entorno $GIT_DIR
vincula un espacio de trabajo al repositorio desde el que se origina.
Los comandos de Git git clone
e git init
tienen ambas opciones, es --bare
que crean repositorios sin un espacio de trabajo inicial. Es desafortunado que Git combine los dos conceptos separados, pero relacionados del espacio de trabajo y el repositorio, y luego usa el término confuso para separar las dos ideas.
Otra diferencia entre un repositorio desnudo y no desnudo es que un repositorio desnudo no tiene un repositorio de origen remoto predeterminado:
derek@derek-OptiPlex-960:~/Projects$ git clone --bare test bare
Initialized empty Git repository in /home/derek/Projects/bare/
derek@derek-OptiPlex-960:~/Projects$ cd bare
derek@derek-OptiPlex-960:~/Projects/bare$ git branch -a
* master
derek@derek-OptiPlex-960:~/Projects/bare$ cd ..
derek@derek-OptiPlex-960:~/Projects$ git clone test non-bare
Initialized empty Git repository in /home/derek/Projects/non-bare/.git/
cd nonderek@derek-OptiPlex-960:~/Projects$ cd non-bare
derek@derek-OptiPlex-960:~/Projects/non-bare$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/master
Desde la página de manual para git clone --bare
:
Además, las cabezas de bifurcación en el control remoto se copian directamente en las bifurcaciones locales correspondientes, sin asignarlas a refs / remotes / origin /. Cuando se utiliza esta opción, no se crean ramas de rastreo remoto ni las variables de configuración relacionadas.
Presumiblemente, cuando crea un repositorio vacío, Git supone que el repositorio vacío servirá como el repositorio de origen para varios usuarios remotos, por lo que no crea el origen remoto predeterminado. Lo que esto significa es que git push
operaciones básicas de git pull
y git push
no funcionarán, ya que Git supone que sin un espacio de trabajo, no tiene la intención de realizar ningún cambio en el repositorio vacío:
derek@derek-OptiPlex-960:~/Projects/bare$ git push
fatal: No destination configured to push to.
derek@derek-OptiPlex-960:~/Projects/bare$ git pull
fatal: /usr/lib/git-core/git-pull cannot be used without a working tree.
derek@derek-OptiPlex-960:~/Projects/bare$
Un repositorio desnudo no es más que la carpeta .git , es decir, el contenido de un repositorio simple es el mismo que el contenido de la carpeta .git dentro de su repositorio de trabajo local.
- Utilice un repositorio simple en un servidor remoto para permitir que varios contribuyentes impulsen su trabajo.
- No desnudo - El que tiene árbol de trabajo tiene sentido en la máquina local de cada colaborador de su proyecto.
Un repositorio desnudo tiene beneficios en
- uso reducido de disco
- menos problemas relacionados con el comando remoto (ya que ningún árbol de trabajo está ahí para desconectarse o tener cambios conflictivos)
Un repositorio no simple simplemente tiene un árbol de trabajo extraído. El árbol de trabajo no almacena ninguna información sobre el estado del repositorio (ramas, etiquetas, etc.); más bien, el árbol de trabajo es solo una representación de los archivos reales en el repositorio, lo que le permite trabajar en (editar, etc.) los archivos.