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?


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)


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.


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.


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}\.


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 .


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

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


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

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 .


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


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.


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).


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.


0

Em uma máquina Windows

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

git config --sistema 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.