Nome do arquivo muito longo no Git para Windows

665

Estou usando Git-1.9.0-preview20140217para Windows. Como eu sei, esta versão deve corrigir o problema com nomes de arquivos muito longos. Mas não para mim.

Certamente eu estou fazendo algo errado: eu fiz git config core.longpaths truee git add .e depois git commit. Tudo ocorreu bem. Mas quando agora faço um git status, recebo uma lista de arquivos comFilename too long , por exemplo:

node_modules/grunt-contrib-imagemin/node_modules/pngquant-bin/node_modules/bin-wrapper/node_modules/download/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-handle-source-errors.js: Filename too long

É muito simples de reproduzir para mim: basta criar um Yeoman aplicativo da Web com o gerador Angular ("yo angular") e remover node_modulesdo .gitignorearquivo. Em seguida, repita os comandos Git acima mencionados.

O que estou perdendo aqui?

Papa Mufflon
fonte
Onde você lê que essa versão deve corrigir os nomes de arquivos longos?
Iveqy
Aqui está a solicitação de recebimento
Papa Mufflon
@PapaMufflon, você pode alterar a resposta aceita para aquela com mais pontos? Isso me ajudou muito.
precisa saber é o seguinte
@ v.karbovnichy, por favor, leia minha pergunta com atenção. Eu já executei o comando na resposta votada superior. Mas, no momento em que fiz a pergunta, a resposta aceita estava correta: o msys ainda tinha essa limitação de caracteres. Agora que a limitação se foi e o git config core.longpaths true funciona como deveria.
Papa Mufflon
Ok, eu concordo então
v.karbovnichy 5/11

Respostas:

706

O Git tem um limite de 4096 caracteres para um nome de arquivo, exceto no Windows quando o Git é compilado com msys. Ele usa uma versão mais antiga da API do Windows e há um limite de 260 caracteres para um nome de arquivo.

Então, pelo que entendi, é uma limitação do msys e não do Git. Você pode ler os detalhes aqui: https://github.com/msysgit/git/pull/110

Você pode contornar isso usando outro cliente Git no Windows ou conjunto core.longpathsde truecomo explicado em outras respostas.

git config --system core.longpaths true

O Git é construído como uma combinação de scripts e código compilado. Com a alteração acima, alguns scripts podem falhar. Esse é o motivo do core.longpaths não ser ativado por padrão.

A documentação do Windows em https://docs.microsoft.com/en-us/windows/desktop/fileio/naming-a-file possui mais algumas informações:

A partir do Windows 10, versão 1607, as limitações MAX_PATH foram removidas das funções comuns de arquivo e diretório do Win32. No entanto, você deve aceitar o novo comportamento.

Uma chave do Registro permite ativar ou desativar o novo comportamento do caminho longo. Para habilitar o comportamento do caminho longo, defina a chave do Registro em HKLM \ SYSTEM \ CurrentControlSet \ Control \ FileSystem LongPathsEnabled (Tipo: REG_DWORD)

iveqy
fonte
19
A limitação de 260 caracteres em um caminho não é específica para o MSYS, é uma imitação geral da API do Windows. Isso pode ser contornado usando caminhos Unicode, mas isso tem outras desvantagens, e é por isso que core.longpathsnão é ativado por padrão. Observe também que o Git para Windows não foi compilado no MSYS. Em vez disso, é um aplicativo nativo do Windows que vem com um ambiente MSYS simplificado.
sschuberth
3
@sschuberth: Existem outros inconvenientes além da falta de compatibilidade com programas que não oferecem suporte a caminhos longos?
JAB
3
@JAB Outra desvantagem é que caminhos longos sempre precisam ser absolutos; caminhos relativos não são suportados. Para mais detalhes, consulte aqui .
sschuberth
4
Ou, como solução rápida, tente fazer o checkout de seu repositório em C: / no Windows, reduzindo assim o número de caracteres do caminho da pasta.
Akshay Lokur
5
Para sua informação, no momento, o problema ainda persiste. Podemos considerar desenvolvimento contínuo em um sistema operacional real ...
Géza Török
1034

Você deve poder executar o comando

git config --system core.longpaths true

ou adicione-o a um dos seus arquivos de configuração do Git manualmente para ativar essa funcionalidade, quando você estiver em uma versão suportada do Git. Parece que talvez 1.9.0 e depois.

sparkym3
fonte
13
Esta opção de configuração corrigiu o problema para mim, mesmo com o msys, como mencionado na resposta aceita. (Especificamente, versão 1.9.4.msysgit.2).
Alex Osborn
5
O Sourcetree age um pouco estranho, a menos que você "também verifique se o SourceTree está usando o Git do sistema e não o incorporado". - Obrigado a Matej Drolc por esse conselho.
bstoney
38
Aqui estão algumas informações básicas por que isso não está ativado por padrão e alguns detalhes técnicos.
sschuberth
12
get "não pôde bloquear o arquivo de configuração C: \ Arquivos de Programas \ Git \ mingw64 / etc / gitconfig" após executar o comando acima. Mas a resposta @Yash funcionou para mim
divideByZero
10
O @divideByZero executando o git bash como administrador evita esse erro.
Niek
204

Isso pode ajudar:

git config core.longpaths true

Explicação básica: Esta resposta sugere não aplicar essa configuração às configurações do sistema global (a todos os projetos para evitar --systemou --globalmarcar). Este comando apenas resolve o problema sendo específico ao projeto atual.

Sagiruddin Mondal
fonte
13
As pessoas aqui têm notado que esta definição pode apresentar um comportamento imprevisível por isso parece que é preferível usar o comando acima como um ambiente local em projetos em que necessitam dele em vez de acrescentar --systemque irá aplicá-lo a todos os projetos
Grant Humphries
4
ei, isso é apenas uma copypasta da outra resposta altamente votada. pode, no mínimo, explicar por que você prefere remover a opção --system ..
Félix Gagnon-Grenier
78

Crie .gitconfig e adicione

[core]
longpaths = true

Você pode criar o arquivo em um local do projeto (não tenho certeza) e também no local global. No meu caso, a localização é C:\Users\{name}\.

Yash
fonte
10
Você também pode fazer isso com o seguinte comando:git config --global core.longpaths true
Curly
git configuração --global core.longpaths verdadeiros trabalharam para mim graças
Rama Krishna Ila
1
Usando o Visual Studio, as soluções git bash acima não funcionaram para mim, mas a localização do arquivo .git / config para o projeto e a edição, como mostrado acima, funcionaram. Obrigado yash.
andrew pate
Isso funcionou para mim, eu localizado o arquivo e modificou-lo manualmente
Patlatus
1
As respostas mencionadas e verificadas acima estão corretas, mas com as permissões concedidas ao arquivo, talvez não seja possível atualizar o arquivo com esses comandos. Essa abordagem é realmente fácil, porque é manual e funcionou muito bem para mim. Você pode encontrar facilmente o .gitconfigarquivo no caminho a seguir C:\Users\{username}e simplesmente editá-lo.
Kavindu Narathota
53

Passos a seguir:

  1. Execute o Git Bash como administrador
  2. Execute o seguinte comando:
git config --system core.longpaths true

Nota : se a etapa 2 não funcionar ou der algum erro, você também pode tentar executar este comando:

git config --global core.longpaths true

Leia mais sobre git config aqui .

Saikat
fonte
35

A melhor solução é ativar o parâmetro longpath do Git.

git config --system core.longpaths true

Mas uma solução alternativa que funciona é remover a pasta node_modules do Git:

$ git rm -r --cached node_modules
$ vi .gitignore

Adicione node_modules em uma nova linha dentro do arquivo .gitignore. Depois de fazer isso, faça suas modificações:

$ git add .gitignore
$ git commit -m "node_modules removed"
$ git push
Janderson Silva
fonte
3
Há um bom motivo para manter a pasta node_modules marcada no git: se você deseja que seu software se comporte da mesma maneira após um ano de módulos potencialmente desaparecendo do npm.
cfstras
@cfstras se alguma biblioteca tem uma vulnerabilidade e você não atualiza periodicamente, certamente você terá problemas de segurança.
Janderson Silva
1
Claro que você precisa atualizar suas dependências. Mas somente quando você quer, e se algo quebrar, você quer que seu backup no git ...
cfstras
É verdade. Vou editar minha resposta. Obrigado pelo seu comentário.
Janderson Silva
1
Não há necessidade de confirmar node_modules: o packages.lockarquivo está aqui para garantir que a versão instalada por npm installsempre será a mesma, até que você faça umnpm update
Pierre-Olivier Vares
32

Para ter certeza absoluta de que ele entra em vigor imediatamente após a inicialização do repositório, mas antes que o histórico remoto seja buscado ou que qualquer arquivo seja retirado, é mais seguro usá-lo desta maneira:

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

-c chave = valor

Defina uma variável de configuração no repositório recém-criado; isso entra em vigor imediatamente após a inicialização do repositório, mas antes da busca do histórico remoto ou da retirada de arquivos. A chave está no mesmo formato esperado pelo git-config 1 (por exemplo, core.eol = true). Se vários valores forem fornecidos para a mesma chave, cada valor será gravado no arquivo de configuração. Isso torna seguro, por exemplo, adicionar refespecs de busca adicionais ao controle remoto de origem.

Mais informações

Relojoeiro
fonte
24

A execução git config --system core.longpaths truegerou um erro para mim:

"erro: não foi possível bloquear o arquivo de configuração C: \ Arquivos de Programas (x86) \ Git \ mingw32 / etc / gitconfig: Permissão negada"

Corrigido com a execução do comando no nível global:

git config --global core.longpaths true
Arpit Aggarwal
fonte
As configurações globais afetam apenas o usuário atual, enquanto as configurações do sistema afetam todos os usuários na máquina. Se esta é sua estação de trabalho, eles são efetivamente os mesmos que você pode usar apenas um usuário.
toalha
4
Se você executou o aplicativo de linha de comando como administrador, o primeiro comando funcionaria!
Sachith Dickwella 7/03/19
12

Você também pode tentar ativar caminhos de arquivo longos.

Se você executar o Windows 10 Home Edition, poderá alterar seu registro para permitir caminhos longos.

Vá para HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystemdentro regedite defina LongPathsEnabledcomo 1.

Se você possui o Windows 10 Pro ou Enterprise, também pode usar diretivas de grupo local.

Vá para Configuração do ComputadorModelos AdministrativosSistemaSistema de Arquivos em gpedit.msc, aberta Ativar Win32 caminhos longos e configurá-lo para Ativado .

Julian Veerkamp
fonte
5
Eu acredito que isso deve ser feito em combinação com a configuração do git, e vale a pena notar que ele não funciona com o Windows Explorer pelos motivos mencionados aqui .
Neo
11
git config --global core.longpaths true

O comando acima funcionou para mim. Usar '--system' me deu um erro de arquivo de configuração não bloqueado

amalik2205
fonte
2
para usuários do Github Desktop, este é o único que funciona porque o Github Desktop usa sua própria configuração do Git.
Csaba
4

Mover o repositório para a raiz da sua unidade (correção temporária)

Você pode tentar mover temporariamente o repositório local (a pasta inteira) para a raiz da sua unidade ou o mais próximo possível da raiz.

Como o caminho é menor na raiz da unidade, às vezes ele corrige os problemas.

No Windows, eu moveria isso para C:\a raiz de outra unidade.

Dheeraj Bhaskar
fonte
2
Essa é a única coisa que resolveu meu problema. Era que eu tinha muitas pastas no caminho.
precisa
2

Também tive esse erro, mas no meu caso, a causa estava usando uma versão desatualizada do npm, v1.4.28.

Atualizando para o npm v3 seguido por

rm -rf node_modules
npm -i

trabalhou para mim. A edição 2697 da npm possui detalhes da estrutura de pastas "maximally flat" incluída na npm v3 (lançada em 25/06/2015).

James Green
fonte
1

Se você estiver trabalhando com sua partição criptografada, considere mover a pasta para uma partição não criptografada, por exemplo, a / tmp , executando git pulle retornando.

augustowebd
fonte
0

Em uma máquina Windows

Execute o prompt de comando como administrador e execute o comando abaixo

git config --sistema core.longpaths true

kartick shaw
fonte