git pull abortado com nome de arquivo de erro muito longo


114

Estou usando o Windows como sistema operacional e trabalhando em um projeto com um amigo que usa um Mac. Ele registrou o código em nosso Github.

Eu estava tentando fazer o pull de tudo o que ele fazia e abortou com erros "nome do arquivo muito longo" do código de terceiros.

O que eu posso fazer?


Esse problema tem dois casos principalmente diferentes, dependendo de sua operação. Se o repositório já existe, você pode editar sua configuração. Mas se não for? Para clonagem / checkout com criação de um novo diretório, apenas a resposta de @AlexRosenfeld ajudará.
Gangnus de

Respostas:


200

O FAQ do msysgit no Git não pode criar um diretório de arquivo com um caminho longo que não parece atualizado, pois ainda está vinculado ao antigo tíquete do msysgit # 110 . No entanto, de acordo com o tíquete nº 122 posterior , o problema foi corrigido no msysgit 1.9, assim:

  1. Atualizar para msysgit 1.9 (ou posterior)
  2. Lançar Git Bash
  3. Vá para o seu repositório Git que 'sofre' de problemas com caminhos longos
  4. Habilite o suporte a caminhos longos com git config core.longpaths true

Até agora, funcionou muito bem para mim.

Esteja ciente do aviso importante no comentário sobre o tíquete # 122

não volte aqui e reclame que ele quebra o Windows Explorer, cmd.exe, bash ou quaisquer ferramentas que você esteja usando.


Existem algumas atualizações, parece que há algum script adicional que você precisa executar depois de instalar mysysgit github.com/msysgit/git/pull/122#issuecomment-43653756
Adam Grant

18
O que realmente funcionou foi: git config --global core.longpaths true
Anton Andreev

@AntonAndreev Sim, se você deseja defini-lo no escopo global, tudo bem. O escopo local por repositório também é perfeitamente válido.
mloskot 01 de

Não funcionou para mim sem defini-lo em nível global.
Anton Andreev

1
Dessa forma, não funcionará para clonagem / checkout com a criação de um novo diretório. Apenas a resposta de @AlexRosenfeld ajudará.
Gangnus de

69

Solução 1 - defina a configuração global, executando este comando:

git config --system core.longpaths true

Solution2 - ou você pode editar diretamente seu arquivo de configuração git específico como abaixo:

YourRepoFolder -> .git -> config:

[core]
    repositoryformatversion = 0
    filemode = false
    ...
    longpaths = true        <-- (add this line under core section)

Solução 3 - ao clonar um novo repositório: aqui .


1
Dessa forma, não funcionará para clonagem / checkout com a criação de um novo diretório. Apenas a resposta de @AlexRosenfeld ajudará.
Gangnus de

Eu atualizei a resposta com isso, para ter em um lugar, obrigado.
Daniel Hári

26

Alguns anos depois, mas gostaria de acrescentar que, se precisar fazer isso de uma só vez (como eu fiz), você pode definir as configurações durante o comando clone. Experimente isto:

git clone -c core.longpaths=true <your.url.here>

1
Saúde, companheiro! Isso funcionou muito bem ao clonar um novo diretório do github.
Jay Killeen

Não tem problema, fico feliz que ajudou!
xandermonkey

1
Sim! Este, e para clonagem - apenas este funciona!
Gangnus de

Isso não funciona, minha clonagem ainda é abortada. Estou usando git version 1.8.4.msysgit.0, alguma ideia?
Simple-Solution

Parece que está obsoleto . Talvez tente usar git-scm? Que erro você obteve?
xandermonkey

12

Abra o arquivo your.gitconfig para adicionar a propriedade longpaths. Portanto, será semelhante ao seguinte:

[core]
symlinks = false
autocrlf = true
longpaths = true

1
Dessa forma, não funcionará para clonagem / checkout com a criação de um novo diretório. Apenas a resposta de @AlexRosenfeld ajudará.
Gangnus de

6

Como alguém que tem enfrentado esse problema constantemente com repositórios java no Windows, a melhor solução é instalar o Cygwin ( https://www.cygwin.com/ ) e usar sua instalação git em all> devel> git.

A razão pela qual esta é a melhor solução que encontrei é que o Cygwin gerencia os nomes de caminho longos para que outros comandos fornecidos se beneficiem. Ex: localizar, cp e rm. Acredite em mim, o verdadeiro problema começa quando você precisa excluir nomes de caminhos muito longos no Windows.


4

Tente manter seus arquivos mais próximos da raiz do sistema de arquivos. Mais detalhes: por motivos técnicos, o Git para Windows não pode criar arquivos ou diretórios quando o caminho absoluto tem mais de 260 caracteres .


Parece que só pode ir para 130 [talvez o Windows use caracteres Unicode de byte duplo por baixo] por padrão [?]
rogerdpack de

5
Mais pessoas deveriam estar pressionando a Microsoft para mudar essa restrição (e consertar as APIs legadas que elas quebram). Não há nenhuma razão pela qual ainda devamos viver com este remanescente de dias quando os nomes de arquivos eram restritos a <8>. <3> caracteres. Por não consertar imediatamente, um buraco maior está sendo cavado. Corrija a direção da barra enquanto você está nisso.
cchamberlain

@cchamberlain C: / foo / bar / baz é perfeitamente válido, embora enquanto \ foo \ bar \ baz também seja válido (ele se refere a qualquer unidade lógica em que o diretório de trabalho atual esteja) / foo / bar / baz pode causar ambiguidade com sinalizadores de linha de comando.
JAB

@JAB - É verdade que a barra funciona às vezes, mas como você apontou, ela não é confiável. cmd.exe irá reagir de uma maneira e o PowerShell de outra. Intervalos de preenchimento automático. A API subjacente entende isso, mas cmd.exe não em todos os casos e o uso mais seguro de barra invertida faz com que as strings às vezes precisem de escape. Já existe lixo barra invertida de linha de comando suficiente com o número de espaços e parênteses que existem em caminhos comuns do Windows.
cchamberlain

2
Não é uma solução. A tecnologia deve ser serva do homem, e não o homem deve ser servo da tecnologia.
Daniel Hári

4

No Windows, execute "cmd" como administrador e execute o comando.

"C:\Program Files\Git\mingw64\etc>"
"git config --system core.longpaths true"

ou você tem que chmod para a pasta onde o git está instalado.

ou manullay atualize seu arquivo manualmente indo para o caminho "Git \ mingw64 \ etc"

[http]
    sslBackend = schannel
[diff "astextplain"]
    textconv = astextplain
[filter "lfs"]
    clean = git-lfs clean -- %f
    smudge = git-lfs smudge -- %f
    process = git-lfs filter-process
    required = true
[credential]
    helper = manager
**[core]
    longpaths = true**
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.