Repositório de clones GIT no sistema de arquivos local no Windows

200

Eu sou um Noob completo quando se trata de GIT. Eu tenho dado meus primeiros passos nos últimos dias. Eu configurei um repositório no meu laptop, baixei o tronco de um projeto SVN (tive alguns problemas com as filiais, não consegui fazê-las funcionar), mas tudo parece ok por lá.

Agora eu quero poder puxar ou empurrar do laptop para minha área de trabalho principal. O motivo é que o laptop é útil no trem, pois passo 2 horas por dia viajando e posso fazer um bom trabalho. Mas minha principal máquina em casa é ótima para o desenvolvimento. Então, eu quero poder empurrar / puxar do laptop para o computador principal quando chegar em casa. Eu pensei que a maneira mais simples de fazer isso seria ter apenas a pasta de código compartilhada na LAN e fazer:

git clone file://192.168.10.51/code

infelizmente isso não parece estar funcionando para mim:

então eu abro um git bash cmd e digito o comando acima, estou em C: \ code (a pasta compartilhada de ambas as máquinas) é isso que eu recebo de volta:

Initialized empty Git repository in C:/code/code/.git/
fatal: 'C:/Program Files (x86)/Git/code' does not appear to be a git repository
fatal: The remote end hung up unexpectedly

Como posso compartilhar o repositório entre as duas máquinas da maneira mais simples possível.

Haverá outros locais que serão pontos de armazenamento oficiais e locais de onde os outros desenvolvedores, servidores de CI etc. serão transferidos, isso é apenas para que eu possa trabalhar no mesmo repositório em duas máquinas.

De acordo com a sugestão de Sebastian, recebo o seguinte:

C:\code>git clone --no-hardlinks file://192.168.10.51/code
Initialized empty Git repository in C:/code/code/.git/
fatal: 'C:/Program Files (x86)/Git/code' does not appear to be a git repository
fatal: The remote end hung up unexpectedly

** EDITAR - RESPOSTA **

Obrigado a todos que ajudaram. Eu tentei mapear uma unidade e isso funcionou, então pensei em voltar e tentar novamente sem mapear. O resultado final foi:

git clone file://\\\\192.168.0.51\code

Isso funcionou muito bem.

obrigado

Jon
fonte
file: //192.168.10.51/code não é de forma alguma um URI válido apontando para um arquivo, enquanto file: // C: \ foo \ bar.txt is
Gregory Pakosz
Então, como posso apontar para uma máquina remota com essa referência?
31410 Jon
Você provavelmente deseja mapear uma unidade de rede.
Josh Lee
trabalhou para mim - note que este é específico para o Windows e não vai funcionar do bash git no windows - necessidade de uso cmd ou powershell
Dave Rael
também tentei no cmd, mas não funciona. E também o que é "código" no "arquivo git clone: ​​// \\\\ 192.168.0.51 \ code" significa? Substituí-o por "C: / UniserverZ / www / sampleProject /" e não funcionou. Ele disse que não é um repositório git
boi_echos

Respostas:

177

Você pode especificar o URL do controle remoto aplicando o caminho UNC ao protocolo do arquivo. Isso requer que você use quatro barras:

git clone file:////<host>/<share>/<path>

Por exemplo, se sua máquina principal possui o IP 192.168.10.51 e o nome do computador main, e possui um compartilhamento nomeado codeque é um repositório git, os dois comandos a seguir devem funcionar igualmente:

git clone file:////main/code
git clone file:////192.168.10.51/code

Se o repositório Git estiver em um subdiretório, basta anexar o caminho:

git clone file:////main/code/project-repository
git clone file:////192.168.10.51/code/project-repository
cutucar
fonte
2
existe uma maneira de autenticar (ou seja, nome de usuário / senha) com esse esquema?
intuited
1
@majgis Eu quase uso apenas o Windows, então minha solução funciona para o Windows.
poke
1
Sim, esta é a melhor maneira de fazer isso no Windows.
Nicholas DiPiazza
3
Pode-se também usar o protocolo: //// usuário: senha @ host: port / path notação, por exemplo: file: /// usuário: [email protected]/code
pistache
1
@OderWat Exceto que o uso do host local não ajudará em nada ao tentar acessar um computador diferente, que era a questão. Se você quiser acessar um local de repositório, ou seja, que existe localmente no seu sistema de arquivos, você pode apenas usar um caminho local sem usar o protocolo de arquivo ...
picar
125
$ git clone --no-hardlinks /path/to/repo

O comando acima usa a notação de caminho POSIX para o diretório com seu repositório git. Para Windows, é (o diretório C:/path/to/repocontém o .gitdiretório):

C:\some\dir\> git clone --local file:///C:/path/to/repo my_project

O repositório será clonado para C:\some\dir\my_project. Se você omitir file:///parte, a --localopção estará implícita.

jfs
fonte
7
Isso funcionou para mim para caminhos de arquivo com espaços: git clone -l file: // "C: \ algum caminho \ COM ESPAÇOS" my_project
Sebastian Patten
1
Ótima ajuda. Isso funciona para mim na minha máquina Windows 7. <from git bash command prompt> algo como: git clone file: /// C: / Users / nome de usuário / repsitoryName
Forhad
você provavelmente desejará configurar o controle remoto posteriormente .. caso contrário, ele aponta para o seu outro local como origem, o que eu acho super propenso a erros. use git remote -v; git remote rm origin; origem add git <repo-address> (que você pode copiar depois de fazer git -v remoto no repo locais original)
Hanan
Isso está correto, você não precisa usar um formulário de URL como file: ////, basta clonar um diretório.
Peter N. Steinmetz
14

a resposta com o nome do host não funcionou para mim, mas isso funcionou:

arquivo clone git: ////home/git/repositories/MyProject.git/

Talaat Safwat
fonte
1
Parece que você tem muitas barras depois de "file:". Para mim, o número mágico era de 3 barras #
Mark F Guerra
Esquisito. Quatro barras me deram um erro fatal. Só funcionou (para mim) com três.
Big McLargeHuge 29/09
4
Meu truque para descobrir a sintaxe que funciona é criar um arquivo txt na pasta e arrastá-lo para abrir no navegador. O URL correto para um arquivo é exibido.
AnneTheAgile
7

Consegui fazer isso usando file: //, mas com uma barra adicional para indicar um caminho absoluto.

git clone file:///cygdrive/c/path/to/repository/

No meu caso, estou usando o Git no Cygwin para Windows, que você pode ver por causa da parte / cygdrive / c nos meus caminhos. Com alguns ajustes no caminho, ele deve funcionar com qualquer instalação do git.

Adicionar um controle remoto funciona da mesma maneira

git remote add remotename file:///cygdrive/c/path/to/repository/
Mark F Guerra
fonte
6

Talvez mapeie o compartilhamento como uma unidade de rede e faça

git clone Z:\

Principalmente apenas um palpite; Eu sempre faço essas coisas usando ssh. Seguir essa sugestão, é claro, significa que você precisará mapear essa unidade sempre que pressionar / puxar de / para o laptop. Não tenho certeza de como você configura o ssh para trabalhar sob janelas, mas se você estiver fazendo isso muito, pode valer a pena investigar.

intuído
fonte
@Carlos: Eu acho que só funcionará se você não tiver encontrado cdoutro diretório na Z:unidade. IIRC; Não sou usuário do Windows há algum tempo. Também pode ser que gitinterprete letras de unidade de maneira diferente da convenção padrão do Windows. Você tentou `Z:`?
intuited
errr ... que deveria ter lido "você tentou` Z: \ `?". Bem, exceto com o escape correto, para que o modo de código seja ativado .. #nurrrr .. Acho que não.
intuited
3

Não tenho certeza se foi por causa da minha versão do git (1.7.2) ou o quê, mas as abordagens listadas acima usando o nome da máquina e as opções de IP não estavam funcionando para mim. Um detalhe adicional que pode ou não ser importante é que o repositório era um repositório simples que eu havia inicializado e enviado a partir de uma máquina diferente.

Eu estava tentando clonar project1 como recomendado acima com comandos como:

$ git clone file:////<IP_ADDRESS>/home/user/git/project1
Cloning into project1...
fatal: '//<IP_ADDRESS>/home/user/git/project1' does not appear to be a git repository
fatal: The remote end hung up unexpectedly

e

$ git clone file:////<MACHINE_NAME>/home/user/git/project1
Cloning into project1...
fatal: '//<MACHINE_NAME>/home/user/git/project1' does not appear to be a git repository
fatal: The remote end hung up unexpectedly

O que funcionou para mim foi algo mais simples:

$ git clone ../git/project1
Cloning into project1...
done.

Nota - mesmo que o repositório clonado fosse vazio, isso produziu um clone 'normal' com todos os arquivos de código / imagem / recurso reais que eu esperava (ao contrário dos internos do repositório git).

bargar
fonte
1

Digite caminhos absolutos ou caminhos relativos.

Por exemplo, o primeiro abaixo usa caminhos absolutos:

(isso é de dentro da pasta que contém o repositório e o backup como subpastas. também lembre-se de que a pasta de backup não será modificada se já contiver algo. e se não estiver presente, será criada uma nova pasta)

~/git$ git clone --no-hardlinks ~/git/git_test1/   ~/git/bkp_repos/

O seguinte usa caminhos relativos:

~/git$ git clone --no-hardlinks git_test1/   bkp_repos2/
sidquanto
fonte
0

Embora o caminho UNC seja suportado desde o Git 2.21 (fevereiro de 2019, veja abaixo), o Git 2.24 (quarto trimestre de 2019) permitirá

git clone file://192.168.10.51/code

Não basta mais file:////xxx' file://', é suficiente para se referir a um compartilhamento de caminho UNC.
Consulte " Git Fetch Error with UNC ".


Observe que desde 2016 e o MingW-64 git.exe empacotado com o Git for Windows , um caminho UNC é suportado.
(Consulte " Como o msys, o msys2 e o MinGW-64 estão relacionados entre si? ")

E com o Git 2.21 (fevereiro de 2019), esse suporte se estende até mesmo em um shell msys2 (com aspas no caminho UNC).

Consulte commit 9e9da23 , commit 5440df4 (17 jan 2019) por Johannes Schindelin ( dscho) .
Ajudado por: Kim Gybels ( Jeff-G) .
(Incorporado por Junio ​​C Hamano - gitster- in commit f5dd919 , 05 de fevereiro de 2019)

Antes do Git 2.21, devido a uma peculiaridade do método do Git git-upload-pack, havia um problema ao passar caminhos com barras invertidas: O Git forçava a linha de comando através do shell, que possui semânticas de citação diferentes no Git for Windows (sendo um MSYS2 programa) que executáveis ​​Win32 regulares, como git.exeele próprio.

O sintoma é que a primeira das duas barras invertidas nos caminhos UNC do formulário \\myserver\folder\repository.gité removida .

Isso é mitigado agora:

mingw: argumentos de casos especiais para sh

O tempo de execução do MSYS2 faz o possível para emular a expansão e a retirada de cotas de caracteres curinga da linha de comando, que seriam executadas pelo shell Unix chamado nos sistemas Unix.

Essas regras de cotação de shell do Unix diferem das regras de cotação aplicadas ao cmd e ao Powershell do Windows, tornando um pouco estranho citar os parâmetros da linha de comando corretamente ao gerar outros processos.

Em particular, git.exetransmite argumentos para subprocessos que não devem ser interpretados como curingas e, se eles contêm barras invertidas, eles não devem ser interpretados como caracteres de escape, por exemplo, ao passar pelos caminhos do Windows.

Nota: isso é apenas um problema ao chamar executáveis ​​MSYS2, não ao chamar executáveis ​​MINGW, como o git.exe. No entanto, chamamos executáveis ​​MSYS2 com freqüência, principalmente ao definir o use_shellsinalizador na estrutura child_process.

Não há uma maneira elegante de determinar se o .exearquivo a ser executado é um programa MSYS2 ou um MINGW.
Mas como o caso de uso de passar uma linha de comando pelo shell é tão prevalente, precisamos solucionar esse problema pelo menos durante a execução sh.exe.

Vamos apresentar um teste feio e codificado, se argv[0]" sh" e se refere ao MSYS2 Bash, para determinar se precisamos citar os argumentos de maneira diferente do habitual.

Isso ainda não resolve o problema completamente, mas pelo menos é alguma coisa.

Aliás, isso também corrige o problema em que git clone \\server\repohouve falha devido ao tratamento incorreto das barras invertidas ao entregar o caminho para o git-upload-packprocesso.

Além disso, precisamos ter o cuidado de citar não apenas espaços em branco e barras invertidas, mas também colchetes.
Como os aliases frequentemente passam pelo MSYS2 Bash, e como os aliases frequentemente obtêm parâmetros como HEAD@{yesterday}, isso é realmente importante.

Vejo t/t5580-clone-push-unc.sh

VonC
fonte
0

Depois do clone, para mim, o push não estava funcionando.

Solução: Onde o repo é clonado, abra a pasta .git e o arquivo de configuração.

Para o valor definido do URL de origem remota:

[remote "origin"]
    url = file:///C:/Documentation/git_server/kurmisoftware
idanek
fonte