¿Cómo se utiliza el repositorio "git --bare init"?

Resuelto André asked hace 12 años • 10 respuestas

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.

André avatar Oct 03 '11 15:10 André
Aceptado

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.

Mark Longair avatar Oct 03 '2011 08:10 Mark Longair

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/workno 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/workejecutas 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 branchno 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 configcomandos 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 masterrama 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-upstreamno 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 -ubandera 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.

adelphus avatar Jul 23 '2015 14:07 adelphus

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 .gitel directorio.

Solo puede acceder commital repositorio vacío accediendo pusha é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 barerepositorio.

Marcin Gil avatar Oct 03 '2011 08:10 Marcin Gil