Estoy agregando esta respuesta porque después de llegar aquí (con la misma pregunta), ninguna de las respuestas realmente describe todos los pasos necesarios para pasar de la nada a un repositorio remoto (desnudo) totalmente utilizable.
Nota: este ejemplo utiliza rutas locales para la ubicación del repositorio simple, pero otros protocolos git (como SSH indicado por el OP) deberían funcionar bien.
Intenté agregar algunas notas en el camino para aquellos menos familiarizados con git.
1. Inicialice el repositorio desnudo ...
> 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 compromisos y, lo que es más importante, no tiene ramas . Aunque puede clonar este repositorio, no puede extraerlo.
A continuación, necesitamos crear una carpeta de trabajo. Hay un par de formas de hacerlo, 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 si es una carpeta vacía. Tome nota de la advertencia: en esta etapa, todavía no tiene nada útil. Si usted cd /path/to/work
y corre git status
, obtendrá 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 adelphus@example.com
> 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 solo son necesarios si aún no le has dicho a git quién eres. Tenga en cuenta que si ahora ejecuta git branch
, ahora 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 "ido", simplemente no se ha creado todavía y git branch --unset-upstream
no ayudará. Pero está bien, ahora que tenemos nuestro primer commit, podemos presionar y se creará master 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 desnudo completamente funcional que se puede clonar en otro lugar en una rama maestra, así como una copia de trabajo local que puede extraer y empujar.
> git pull
Already up-to-date.
> git push origin master
Everything up-to-date
2b. Crear una carpeta de trabajo a partir de archivos existentes
Si ya tiene una carpeta con archivos (por lo que no puede clonar en ella), puede inicializar un nuevo repositorio git, agregar un primer commit y luego vincularlo al repositorio desnudo después.
> 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 nuestro primer commit y una rama maestra local que necesitamos convertir en una rama ascendente de 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.
Observe la -u
bandera en git push para establecer la (nueva) rama ascendente rastreada. Al igual que antes, ahora tenemos un repositorio desnudo completamente funcional que se puede clonar en otro lugar en una rama maestra, así como una copia de trabajo local que puede extraer y empujar.
Todo esto puede parecer obvio para algunos, pero git me confunde en el mejor de los casos (sus mensajes de error y estado realmente necesitan un poco de revisión); con suerte, esto ayudará a otros.
--shared
opcióninit
si planea hacer que otras personas presionen para este repositorio. Agrega automáticamente permisos de escritura grupal al repositorio - enlace