clone git através do ssh


233

Eu tenho um projeto no qual criei um repositório git:

$ cd myproject  
$ git init  
$ git add .  
$ git commit  

Eu queria criar um clone nu em outra máquina:

$ cd ..  
$ git clone --bare myproject  ssh://user@server:/GitRepos/myproject.git  

Eu executei o clone, mas não imprimi nenhuma resposta. Entrei na máquina do servidor e tentei ver como os arquivos são armazenados. O caminho / GitRepos estava vazio, então decidi fazer o clone novamente:

$ git clone --bare myproject  ssh://user@server:/GitRepos/myproject.git

Desta vez, a resposta foi:

fatal: caminho de destino 'ssh: // usuário @ servidor: /GitRepos/myproject.git' já existe e não é um diretório vazio.

Mas vi que o caminho estava vazio.
O que está acontecendo aqui ?


Eu não acho que correr git clone --barefará o que você pensa que fará.
Wolfer

3
Para mim, o ssh: // criou uma pasta, em vez de usar um protocolo remoto. Preciso trabalhar com a resposta de @ alec-the-geek. Você se importaria de selecionar uma resposta preferida para isso - é seu trabalho.
27615

1
@akauppi: É responsabilidade do OP considerar todas as respostas, mas elas não têm obrigação de selecionar uma resposta até que sejam satisfeitas. (Claro, não faz mal para lembrá-los ou perguntar o que mais informações que eles precisam de uma resposta para ser aceitável para eles!)
jvriesem

@jvriesem é claro. Removeria o "é seu trabalho" agora. Mas é uma coisa antiga ... :)
akauppi

Respostas:


219

Isso possivelmente não está diretamente relacionado à questão; mas um erro que acabei de cometer, e vejo no OP, é a especificação da URL ssh://user@server:/GitRepos/myproject.git- ou seja, você tem dois pontos :e uma barra /depois que significa um caminho absoluto.

Encontrei o clone do Git, ssh: não foi possível resolver o nome do host - git, development - Nicolas Kuttler (como era o erro que eu estava recebendo, na gitversão 1.7.9.5), observando:

O problema com o comando que usei inicialmente foi que tentei usar uma sintaxe do tipo scp.

... o que também era meu problema! Então, basicamente em gitcom ssh, você quer uso

  • ssh://username@host.xz/absolute/path/to/repo.git/ - apenas uma barra para o caminho absoluto no servidor
  • username@host.xz:relative/path/to/repo.git/- apenas dois pontos (não deve ter o ssh://caminho relativo no servidor (em relação ao diretório inicial da usernamemáquina do servidor)

Espero que isso ajude alguém,
Saúde!


84
Isso não funciona. Se você quiser especificar um caminho relativo com ssh, precisará perder o ssh://prefixo. Passei apenas 20 minutos tentando descobrir isso. git clone username@host.xz:relative/path/to/repo.git/Deveria trabalhar.
bobbaluba

2
Tentei com o git 2.1.4 no Debian 8. As sugestões não funcionam. Nenhum diretório foi criado em / GitRepos na primeira tentativa e na segunda tentativa reclamou que o caminho já existia. Assim como o problema original relatado
dlsa

5
Por causa do seu comentário @bobbaluba (e pela resposta atualizada), eu não tive que gastar 20 minutos nisso também. Obrigado!
olafure

143

Para repositórios no GitHub, tente:

git clone ssh://git@github.com/<user>/<repository name>.git

Para configurar o git para clonar via ssh, consulte:


é o <usuário> meu nome de usuário no github ou meu endereço de e-mail para o github? porque esse link sugere que eu use o endereço de email durante a geração da chave pública. help.github.com/en/github/authenticating-to-github/… depois de tentar isso (senha vazia para o gen de chave ssh), ainda não consegui clonar o repo do github. ps Não adicionei a chave ao agente.
Minnie

O mesmo funciona para o gitlab também. antes disso, precisamos ativar a configuração da chave SSH, como você sugeriu
Venkataraman R

45

Você precisa executar o comando clone no que está chamando de servidor. Mas aposto que você não está executando um servidor ssh no seu cliente local, para que não funcione de qualquer maneira. Sugira que você siga esta abordagem (verifique o manual porque estou fazendo isso de memória)

  1. Faça logon na máquina do servidor.
  2. Crie um repositório simples usando git init --bare
  3. Na máquina cliente, você pode enviar seu repo para o servidor. git remote add origin ssh://user@server:/GitRepos/myproject.gitSeguido porgit push origin master

Ótimo conselho! Algumas notas para os novatos (como eu) que não lidaram com pastas git-server-pure antes: 2. cd / GitRepos; mkdir myproject.git; cd myproject.git antes do git init --bare. Você não receberá uma cópia de trabalho aqui - os arquivos e pastas de repo (normalmente em .git) ficarão vazios para você, portanto, o nome do sinalizador. Graças
akauppi

2
"git init --bare" não cria um diretório .git. Coloca os arquivos diretamente na pasta. Ao adicionar a origem remota, obtenho: "" fatal: Não é um repositório git (ou qualquer pai / mãe até ponto de montagem / home) Parando nos limites do sistema de arquivos (GIT_DISCOVERY_ACROSS_FILESYSTEM não definido).
DLSA

10

Isenção de responsabilidade: Esta é apenas uma cópia de um comentário de bobbaluba tornado mais visível para futuros visitantes. Isso me ajudou mais do que qualquer outra resposta.


Você deve soltar o ssh://prefixo ao usar git clonecomo exemplo

git clone git@github.com:owner/repo.git

5

tente isso.

Passo 1:

ls -al ~/.ssh

insira a descrição da imagem aqui

Passo 2:

ssh-keygen 

(usando a tecla Enter para o valor padrão) insira a descrição da imagem aqui Etapa 3: Para configurar o arquivo de configuração

vim /c/Users/Willie/.ssh/config

Host gitlab.com
HostName gitlab.com
Usuário git
IdentityFile ~ / .ssh / id_rsa

Passo 4:

git clone git@gitlab.com:<username>/test2.git

insira a descrição da imagem aqui

Etapa 5:
Quando você terminar a Etapa 4
1. o arquivo test2.git será baixado
2. você obterá o novo arquivo (hos_conhecidos) no diretório ~ / .ssh
insira a descrição da imagem aqui

PS: Eu crio o id_rsa e o id_rsa.ub automaticamente e entrego-o ao servidor Gitlab. usando as duas chaves para qualquer lado do cliente (Windows e Linux).


4

Git 101:

gité um sistema de controle de versão descentralizado. Você não precisa de um servidor para instalar o git. Ainda assim, você pode querer fazer isso como parece legal, certo? (Também é útil se você deseja trabalhar em um único projeto a partir de vários computadores.)

Portanto, para executar um "servidor", você precisa executar, git init --bare <your_project>.gitpois isso criará um repositório vazio, que poderá ser importado em suas máquinas sem ter que mexer nos arquivos de configuração em seu .gitdiretório.

Depois disso, você poderá clonar o repositório em seus clientes como ele deve funcionar, mas descobri que alguns clientes (a saber git-gui) não conseguirão clonar um repositório que esteja completamente vazio. Para contornar isso, você precisa executarcd <your_project>.git && touch <some_random_file> && git add <some_random_file> && git commit && git push origin master . (Observe que você pode precisar configurar seu nome de usuário e e-mail para o git dessa máquina, se não o tivesse feito no passado. Os comandos a serem executados estarão na mensagem de erro que você recebe, então eu os omitirei.)

Portanto, neste ponto, você pode clonar o repositório para qualquer máquina simplesmente executando git clone <user>@<server>:<relative_path><your_project>.git. (Como outros já indicaram, pode ser necessário prefixá-lo ssh://se você usar o caminho absoluto.) Isso pressupõe que você já pode efetuar login do seu cliente no servidor. (Você também receberá pontos de bônus por configurar um arquivo de configuração e chaves ssh, se pretender enviar muitas coisas para o servidor remoto.)

Alguns links relevantes:
isso indica o que você precisa saber.
E isso é para aqueles que conhecem o funcionamento básico do git, mas às vezes esquecem a sintaxe exata.


Agora, esses dois links parecem estar mortos ou não mostrando o que você esperava.
Todd

2

Quero tentar uma resposta que inclua git-flow e três 'pontos' ou casos de uso, o repositório central do git, o desenvolvimento local e a máquina de produção. Isso não está bem testado .

Estou dando comandos incrivelmente específicos. Em vez de dizer <your folder>, eu direi /root/git. O único lugar em que estou alterando o comando original é substituir o meu nome de servidor específico example.com. Explicarei a finalidade das pastas para que você possa ajustá-las adequadamente. Informe-me de qualquer confusão e atualizarei a resposta.

A versão git no servidor é 1.7.1. O servidor é o CentOS 6.3 (Final).

A versão git na máquina de desenvolvimento é 1.8.1.1. Este é o Mac OS X 10.8.4.

O repositório central e a máquina de produção estão na mesma máquina.

o repositório central, ao qual os usuários do svn podem se relacionar como 'servidor' é configurado da seguinte maneira. Eu tenho uma pasta /root/gitonde guardo todos os meus repositórios git. Quero criar um repositório git para um projeto que chamo de 'flores'.

cd /root/git
git clone --bare flowers flowers.git

O comando git deu duas mensagens:

Initialized empty Git repository in /root/git/flowers.git/
warning: You appear to have cloned an empty repository.

Nada para se preocupar.

Na máquina de desenvolvimento está configurado da seguinte maneira. Eu tenho uma pasta /home/kinjal/Sitesonde eu coloco todos os meus projetos. Agora eu quero obter o repositório central do git.

cd /home/kinjal/Sites
git clone root@example.net:/root/git/flowers.git

Isso me leva a um ponto em que posso começar a adicionar coisas a ele. Primeiro configurei o fluxo git

git flow init -d

Por padrão, isso está no ramo develop. Eu adiciono meu código aqui, agora. Então eu preciso me comprometer com o repositório central do git.

git add .
git commit -am 'initial'
git push

Nesse ponto, ele foi enviado para o ramo de desenvolvimento. Também quero adicionar isso ao ramo mestre.

git flow release start v0.0.0 develop
git flow release finish v0.0.0
git push

Observe que eu não fiz nada entre o início e o término do lançamento. E quando terminei o lançamento, fui solicitado a editar dois arquivos. Isso levou o ramo de desenvolvimento a dominar.

No site de produção, que está na mesma máquina que meu repositório central do git, quero colocar o repositório /var/www/vhosts/example.net. Eu já tenho /var/www/vhosts.

cd /var/www/vhosts
git clone file:///root/git/flowers.git example.net

Se a máquina de produção também estivesse em uma máquina diferente, o git clonecomando seria semelhante ao usado na máquina de desenvolvimento.


1

No início, estou com um pouco de falta das minhas habilidades no GIT.

Isso vai clonar um repositório vazio na sua máquina, que contém apenas as pastas dentro das .gitquais há um diretório oculto. executar ls -ale você deve ver .gitoucd .git dentro do seu repositório.

Você pode adicionar uma descrição de sua intenção para que alguém com mais habilidades em GIT possa ajudar? O que você realmente quer fazer e como planeja fazê-lo?


Eu interpretei mal o comando. O que fiz foi criar uma árvore de subdiretórios ssh: /myproject.git no diretório atual. Eu pensei que estava clonando em um diretório remoto, mas o que o comando realmente faz é clonar de um repositório.
Dlsa 29/05

0

Eu fiz: git clone --bare "/ GITREPOSITORIES / RepoA" "ssh: // luc @ EERSTENASDS119J / volume1 / RepoA" Resultado: fatal: caminho de destino 'ssh: // luc @ EERSTENASDS119J / volume1 / RepoA' já existe e é não é um diretório vazio.

O sistema criou um diretório ssh: // luc @ EERSTENASDS119J / volume1 / RepoA no meu caminho atual.

Portanto, o git clone não interpretou a especificação da URL. Usou a solução alternativa de Alec.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.