Cómo agregar un repositorio local y tratarlo como un repositorio remoto

234

Estoy tratando de hacer que un repositorio local actúe como un control remoto con el nombre bakde otro repositorio local en mi PC, usando lo siguiente:

git remote add /home/sas/dev/apps/smx/repo/bak/ontologybackend/.git bak

lo que da este error:

fatal: '/home/sas/dev/apps/smx/repo/bak/ontologybackend/.git' is not a valid remote name

Estoy tratando de sincronizar dos repositorios locales, con uno configurado como un nombre remoto bakpara el otro, y luego emitiendo git pull bak.

¿Cuál es la mejor manera de hacerlo?


Editar:

Lo siento, tonto, me acabo de dar cuenta de que el complemento remoto debería ser:

git remote add bak /home/sas/dev/apps/smx/repo/bak/ontologybackend/.git

el nombre del control remoto va antes de la dirección.

opensas
fuente

Respuestas:

273

Tienes tus argumentos para el remote addcomando invertido:

git remote add <NAME> <PATH>

Entonces:

git remote add bak /home/sas/dev/apps/smx/repo/bak/ontologybackend/.git

Ver git remote --helppara más información.

larsks
fuente
66
Sin .gitembargo, ¿se requiere específicamente al final?
Erik Aigner
55
Es solo un camino ... A Git no le importa cómo se llame.
Larsks
2
@ErikAigner tradicionalmente, los repositorios desnudos terminarán con un sufijo ".git". Aunque generalmente no como su propio directorio, sino más bien como: "/path/to/projectname.git". - Aparte de eso, hace poca diferencia.
Atli
77
Parece que necesitas usar una ruta absoluta, que no era obvia para mí. Cuando intenté con un camino relativo, lo conseguí fatal: '../dir' does not appear to be a git repository.
Keith Layne
1
Es importante ubicar file://el frente de la ruta y usar la ruta completa al repositorio local para que el software del cliente pueda acceder a él a través del protocolo esperado. Y en respuesta a la pregunta anterior de Erik, .gitaparentemente se necesita el final del camino.
Scott Lahteine
158

Si su objetivo es mantener una copia local del repositorio para una copia de seguridad fácil o para pegarse en una unidad externa o compartir a través del almacenamiento en la nube (Dropbox, etc.), puede usar un repositorio desnudo . Esto le permite crear una copia del repositorio sin un directorio de trabajo, optimizado para compartir.

Por ejemplo:

$ git init --bare ~/repos/myproject.git
$ cd /path/to/existing/repo
$ git remote add origin ~/repos/myproject.git
$ git push origin master

Del mismo modo, puede clonar como si fuera un repositorio remoto:

$ git clone ~/repos/myproject.git
Matt Sanders
fuente
99
Esta debería ser la respuesta aceptada, porque se ajusta perfectamente a la pregunta "¿Cuál es la mejor manera de hacerlo?". El "repositorio local tratado como un repositorio remoto", como lo llamó @opensas, es de hecho un directorio simple (como un repositorio remoto real)
Jack '
1
Sugiero una edición: si debe usar "git remot add .." + "git push" o simplemente "git clone" se indica aquí: stackoverflow.com/a/31590993/5446285 (respuesta de adelphus)
Jack
1
@Jack: ¿puedes explicar qué te pareció confuso? Estoy feliz de enmendar, pero quiero mantener la respuesta relativamente sucinta.
Matt Sanders
6

Parece que su formato es incorrecto:

Si desea compartir un repositorio creado localmente, o desea recibir contribuciones de alguien más repositorio - si desea interactuar de alguna manera con un nuevo repositorio, generalmente es más fácil agregarlo como un control remoto. Para ello, ejecute git remote add [alias] [url]. Eso agrega [url] bajo un control remoto local llamado [alias].

#example
$ git remote
$ git remote add github [email protected]:schacon/hw.git
$ git remote -v

http://gitref.org/remotes/#remote

Kristian
fuente
0

Estoy publicando esta respuesta para proporcionar un script con explicaciones que cubran tres escenarios diferentes de creación de un repositorio local que tenga un control remoto local. Puede ejecutar todo el script y creará los repositorios de prueba en su carpeta de inicio (probado en Windows git bash). Las explicaciones están dentro del script para guardar más fácilmente sus notas personales, es muy legible, por ejemplo, Visual Studio Code.

También me gustaría agradecer a Jack por vincular a esta respuesta donde adelphus tiene explicaciones prácticas, buenas y detalladas sobre el tema.

Esta es mi primera publicación aquí, así que avise qué debería mejorarse.

## SETUP LOCAL GIT REPO WITH A LOCAL REMOTE
# the main elements:
# - remote repo must be initialized with --bare parameter
# - local repo must be initialized
# - local repo must have at least one commit that properly initializes a branch(root of the commit tree)
# - local repo needs to have a remote
# - local repo branch must have an upstream branch on the remote

{ # the brackets are optional, they allow to copy paste into terminal and run entire thing without interruptions, run without them to see which cmd outputs what

cd ~
rm -rf ~/test_git_local_repo/

## Option A - clean slate - you have nothing yet

mkdir -p ~/test_git_local_repo/option_a ; cd ~/test_git_local_repo/option_a
git init --bare local_remote.git # first setup the local remote
git clone local_remote.git local_repo # creates a local repo in dir local_repo
cd ~/test_git_local_repo/option_a/local_repo
git remote -v show origin # see that git clone has configured the tracking
touch README.md ; git add . ; git commit -m "initial commit on master" # properly init master
git push origin master # now have a fully functional setup, -u not needed, git clone does this for you

# check all is set-up correctly
git pull # check you can pull
git branch -avv # see local branches and their respective remote upstream branches with the initial commit
git remote -v show origin # see all branches are set to pull and push to remote
git log --oneline --graph --decorate --all # see all commits and branches tips point to the same commits for both local and remote

## Option B - you already have a local git repo and you want to connect it to a local remote

mkdir -p ~/test_git_local_repo/option_b ; cd ~/test_git_local_repo/option_b
git init --bare local_remote.git # first setup the local remote

# simulate a pre-existing git local repo you want to connect with the local remote
mkdir local_repo ; cd local_repo
git init # if not yet a git repo
touch README.md ; git add . ; git commit -m "initial commit on master" # properly init master
git checkout -b develop ; touch fileB ; git add . ; git commit -m "add fileB on develop" # create develop and fake change

# connect with local remote
cd ~/test_git_local_repo/option_b/local_repo
git remote add origin ~/test_git_local_repo/option_b/local_remote.git
git remote -v show origin # at this point you can see that there is no the tracking configured (unlike with git clone), so you need to push with -u
git push -u origin master # -u to set upstream
git push -u origin develop # -u to set upstream; need to run this for every other branch you already have in the project

# check all is set-up correctly
git pull # check you can pull
git branch -avv # see local branch(es) and its remote upstream with the initial commit
git remote -v show origin # see all remote branches are set to pull and push to remote
git log --oneline --graph --decorate --all # see all commits and branches tips point to the same commits for both local and remote

## Option C - you already have a directory with some files and you want it to be a git repo with a local remote

mkdir -p ~/test_git_local_repo/option_c ; cd ~/test_git_local_repo/option_c
git init --bare local_remote.git # first setup the local remote

# simulate a pre-existing directory with some files
mkdir local_repo ; cd local_repo ; touch README.md fileB

# make a pre-existing directory a git repo and connect it with local remote
cd ~/test_git_local_repo/option_c/local_repo
git init
git add . ; git commit -m "inital commit on master" # properly init master
git remote add origin ~/test_git_local_repo/option_c/local_remote.git
git remote -v show origin # see there is no the tracking configured (unlike with git clone), so you need to push with -u
git push -u origin master # -u to set upstream

# check all is set-up correctly
git pull # check you can pull
git branch -avv # see local branch and its remote upstream with the initial commit
git remote -v show origin # see all remote branches are set to pull and push to remote
git log --oneline --graph --decorate --all # see all commits and branches tips point to the same commits for both local and remote
}

Jarek
fuente