Como adicionar um repositório local e tratá-lo como um repositório remoto

234

Estou tentando fazer com que um repositório local funcione como um controle remoto com o nome bakde outro repositório local no meu PC, usando o seguinte:

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

que fornece este erro:

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

Estou tentando sincronizar dois repositórios locais, com um configurado como um remoto nomeado bakpara o outro e depois emitindo git pull bak.

Qual é a melhor maneira de fazer isso?


Editar:

Desculpe, meu bobo, acabei de perceber que a adição remota deveria ser:

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

o nome do controle remoto é anterior ao endereço.

opensas
fonte

Respostas:

273

Você tem seus argumentos para o remote addcomando invertido:

git remote add <NAME> <PATH>

Assim:

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

Veja git remote --helppara mais informações.

larsks
fonte
6
É o .gitno final especificamente exigida embora?
Erik Aigner
5
É apenas um caminho ... Git não se importa com o nome.
larsks
2
@ErikAigner tradicionalmente, repositórios nus terminam com um sufixo ".git". Embora geralmente não seja como seu próprio diretório, mas como: "/path/to/projectname.git". - Fora isso, faz pouca diferença.
Atli
7
Parece que você precisa usar um caminho absoluto, o que não era óbvio para mim. Quando tentei com um caminho relativo, consegui fatal: '../dir' does not appear to be a git repository.
Keith Layne
1
É importante colocar file://na frente do caminho e usar o caminho completo para o repositório local, para que o software cliente possa acessá-lo através do protocolo esperado. E em resposta à pergunta de Erik acima, .gitaparentemente no final do caminho é necessário.
Scott Lahteine ​​28/01
158

Se seu objetivo é manter uma cópia local do repositório para facilitar o backup ou colar em uma unidade externa ou compartilhar via armazenamento na nuvem (Dropbox, etc), convém usar um repositório simples . Isso permite criar uma cópia do repositório sem um diretório ativo, otimizado para compartilhamento.

Por exemplo:

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

Da mesma forma, você pode clonar como se fosse um repositório remoto:

$ git clone ~/repos/myproject.git
Matt Sanders
fonte
9
Essa deve ser a resposta aceita, porque se encaixa perfeitamente na pergunta "Qual é o melhor caminho para isso?". O "repositório local tratado como um repositório remoto", como @opensas o chamava, é de fato um diretório simples (como um repositório remoto real)
Jack '
1
Sugiro uma edição: se você deve usar "git remot add .." + "git push" ou apenas "git clone" é indicado aqui: stackoverflow.com/a/31590993/5446285 (resposta de adelphus)
Jack
1
@ Jack - você pode elaborar sobre o que achou confuso? Fico feliz em alterar, mas quero manter a resposta relativamente sucinta.
Matt Sanders
6

Parece que seu formato está incorreto:

Se você deseja compartilhar um repositório criado localmente ou deseja receber contribuições de outro repositório - se quiser interagir de alguma forma com um novo repositório, geralmente é mais fácil adicioná-lo como um controle remoto. Você faz isso executando o git remote add [alias] [url]. Isso adiciona [url] sob um controle remoto local chamado [alias].

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

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

Kristian
fonte
0

Estou postando esta resposta para fornecer um script com explicações que abrangem três cenários diferentes de criação de um repositório local que possua um controle remoto local. Você pode executar o script inteiro e ele criará os repositórios de teste na sua pasta pessoal (testada no windows git bash). As explicações estão no script para facilitar o salvamento em suas anotações pessoais, é muito legível, por exemplo, código do Visual Studio.

Também gostaria de agradecer a Jack por ter vinculado essa resposta, onde Adelphus tem boas e detalhadas explicações sobre o assunto.

Este é o meu primeiro post aqui, por favor, informe o que deve ser melhorado.

## 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
fonte