¿Cómo se utiliza el repositorio "git --bare init"?
Necesito crear un repositorio central de Git pero estoy un poco confundido...
He creado un repositorio básico (en mi servidor git, máquina 2) con:
$ mkdir test_repo
$ git --bare init
Ahora necesito enviar archivos desde mi repositorio local (máquina 1) al repositorio básico (máquina 2). Tengo acceso a la máquina 2 por SSH. La cosa es que creo que no entiendo el concepto de repositorio simple...
¿Cuál es la forma correcta de almacenar mi código en el repositorio básico? ¿Cómo puedo enviar cambios desde mi repositorio local al repositorio básico?
¿La forma correcta de tener un repositorio central es tener un repositorio básico?
Estoy un poco confundido con este tema. Por favor dame una pista sobre esto.
En primer lugar, sólo para comprobarlo, debe cambiar al directorio que creó antes de ejecutar git init --bare
. Además, es convencional dar a los repositorios básicos la extensión .git
. entonces puedes hacer
git init --bare test_repo.git
Para versiones de Git <1.8, lo harías
mkdir test_repo.git
cd test_repo.git
git --bare init
Para responder a sus preguntas posteriores, los repositorios básicos (por definición) no tienen un árbol de trabajo adjunto, por lo que no puede agregarles archivos fácilmente como lo haría en un repositorio no básico normal (por ejemplo, con un git add <file>
archivo git commit
. )
Casi siempre se actualiza un repositorio básico empujándolo (usando git push
) desde otro repositorio.
Tenga en cuenta que en este caso primero deberá permitir que las personas accedan a su repositorio. Cuando estés dentro test_repo.git
, hazlo.
git config receive.denyCurrentBranch ignore
Edición comunitaria
git init --bare --shared=group
Como comentó prasanthv, esto es lo que desea si hace esto en el trabajo, en lugar de para un proyecto de casa privada.
Estoy agregando esta respuesta porque después de llegar aquí (con la misma pregunta), ninguna de las respuestas describe realmente todos los pasos necesarios para pasar de nada a un repositorio remoto (desnudo) totalmente utilizable.
Nota: este ejemplo utiliza rutas locales para la ubicación del repositorio básico, pero otros protocolos de git (como SSH indicado por el OP) deberían funcionar bien.
Intenté agregar algunas notas a lo largo del camino para aquellos menos familiarizados con git.
1. Inicialice el repositorio básico...
> git init --bare /path/to/bare/repo.git
Initialised empty Git repository in /path/to/bare/repo.git/
Esto crea una carpeta (repo.git) y la llena con archivos git que representan un repositorio git. Tal como está, este repositorio es inútil: no tiene confirmaciones y, lo que es más importante, no tiene ramas . Aunque puedes clonar este repositorio, no puedes extraerlo.
A continuación, necesitamos crear una carpeta de trabajo. Hay un par de formas de hacer esto, dependiendo de si tiene archivos existentes.
2a. Cree una nueva carpeta de trabajo (sin archivos existentes) clonando el repositorio vacío
git clone /path/to/bare/repo.git /path/to/work
Cloning into '/path/to/work'...
warning: You appear to have cloned an empty repository.
done.
Este comando solo funcionará si /path/to/work
no existe o es una carpeta vacía. Tome nota de la advertencia: en esta etapa, todavía no tiene nada útil. Si cd /path/to/work
ejecutas git status
, obtendrás algo como:
On branch master
Initial commit
nothing to commit (create/copy files and use "git add" to track)
Pero esto es una mentira. Realmente no estás en la rama master
(porque git branch
no devuelve nada) y hasta ahora no hay confirmaciones.
A continuación, copie/mueva/cree algunos archivos en la carpeta de trabajo, agréguelos a git y cree la primera confirmación.
> cd /path/to/work
> echo 123 > afile.txt
> git add .
> git config --local user.name adelphus
> git config --local user.email [email protected]
> git commit -m "added afile"
[master (root-commit) 614ab02] added afile
1 file changed, 1 insertion(+)
create mode 100644 afile.txt
Los git config
comandos sólo son necesarios si aún no le has dicho a git quién eres. Tenga en cuenta que si ahora ejecuta git branch
, verá la master
rama en la lista. Ahora ejecuta git status
:
On branch master
Your branch is based on 'origin/master', but the upstream is gone.
(use "git branch --unset-upstream" to fixup)
nothing to commit, working directory clean
Esto también es engañoso: el flujo ascendente no se ha "desaparecido", simplemente aún no se ha creado y git branch --unset-upstream
no ayudará. Pero está bien, ahora que tenemos nuestra primera confirmación, podemos enviar y el maestro se creará en el repositorio simple.
> git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 207 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /path/to/bare/repo.git
* [new branch] master -> master
En este punto, tenemos un repositorio básico completamente funcional que se puede clonar en otro lugar de una rama maestra, así como una copia de trabajo local que se puede extraer y enviar.
> git pull
Already up-to-date.
> git push origin master
Everything up-to-date
2b. Cree una carpeta de trabajo a partir de archivos existentes. Si ya tiene una carpeta con archivos (por lo que no puede clonarla), puede inicializar un nuevo repositorio de git, agregar una primera confirmación y luego vincularlo al repositorio básico.
> cd /path/to/work_with_stuff
> git init
Initialised empty Git repository in /path/to/work_with_stuff
> git add .
# add git config stuff if needed
> git commit -m "added stuff"
[master (root-commit) 614ab02] added stuff
20 files changed, 1431 insertions(+)
create mode 100644 stuff.txt
...
En este punto, tenemos nuestra primera confirmación y una rama maestra local que debemos convertir en una rama ascendente con seguimiento remoto.
> git remote add origin /path/to/bare/repo.git
> git push -u origin master
Counting objects: 31, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (31/31), done.
Writing objects: 100% (31/31), 43.23 KiB | 0 bytes/s, done.
Total 31 (delta 11), reused 0 (delta 0)
To /path/to/bare/repo.git
* [new branch] master -> master
Branch master set up to track remote branch master from origin.
Tenga en cuenta la -u
bandera en git push para configurar la (nueva) rama ascendente rastreada. Al igual que antes, ahora tenemos un repositorio básico completamente funcional que se puede clonar en otro lugar de una rama maestra, así como una copia de trabajo local que se puede extraer y enviar.
Todo esto puede parecer obvio para algunos, pero git me confunde en el mejor de los casos (son mensajes de error y de estado que realmente necesitan algo de reelaboración); con suerte, esto ayudará a otros.
Respondiendo a tus preguntas una por una:
El repositorio simple es aquel que no tiene un árbol de trabajo . Significa que todo su contenido es lo que tienes en .git
el directorio.
Solo puede acceder commit
al repositorio vacío accediendo push
a él desde su clon local. No tiene árbol de trabajo, por lo que no tiene archivos modificados ni cambios.
Para tener un repositorio central la única forma es tener un bare
repositorio.