git não pode adicionar arquivos, vê mudanças

4

Eu tenho um projeto existente, implantado no heroku e sob o controle do git. Eu tenho regularmente adicionado e comprometido o código.

Eu recentemente reconstruí o computador em que estou trabalhando (OSX, 10.6) e agora quando invoco

git status

Eu vejo minhas alterações, mas quando tento adicionar os arquivos alterados para confirmar, obtenho

Dans-iMac-335:[app-name-obscured] apple$ git add public/javascripts/*
fatal: Unable to write new index file

Eu clonei o projeto do repositório heroku git e posso adicionar lá. A propriedade dos arquivos nos dois projetos é a mesma. O que poderia estar causando isso? Minha opção é adicionar cada um dos arquivos alterados à versão recém-clonada e reconstruí-la dessa forma, mas há muitas alterações, e parece que há uma correção aqui.

Alguém experimentou isso e alguma idéia por onde começar?

Chris: obrigado pela resposta exaustiva.

Eu posso rodar o git usando o sudo. Parece, nesse sentido, ser um problema de permissões, embora o diretório seja 755, e de minha propriedade, e os arquivos anexos 644, novamente de propriedade de mim (mesmo usuário que possui os arquivos de projeto). Há muito espaço em disco, e a sugestão de que o diretório é gravável é boa, mas eu estava rodando o git dentro do diretório que contém o projeto - ele ainda precisaria criar o caminho então?

Eu não encontro o ktrace no meu sistema, e eu não sou um especialista em manipulações de terminal, mas eu tentei executar o dtruss. Isso não mostrou problemas, mas ocorreu-me que porque eu tinha que usar o sudo para rodar o dtruss, isso significava que o processo que o dtruss estava monitorando também estava rodando como superusuário. De qualquer forma, nesse ponto ele foi capaz de adicionar os itens ao git, e também usando o sudo eu consegui comê-los agora mesmo. O problema é quando se adiciona um novo item, em vez de um novo. Se eu tivesse feito algo como

sudo dtruss su <my_username> git add some/file/name/*

Eu poderia rodar o git como meu nome normal? Eu pensei nisso depois de ter cortado o caminho para obter o resultado desejado.

Eu posso viver usando o sudo para operações em que itens são adicionados e confirmados por enquanto. O que eu quero fazer é colocar meu repositório heroku em linha com o trabalho atual: então eu entendo que posso clonar isso e ver se o problema desaparece. Caso contrário, voltarei…

    
por omnivore 29.09.2010 / 01:04

1 resposta

3

O índice geralmente é armazenado no nível superior do diretório .git do repositório. Sua localização pode ser substituída usando a variável de ambiente GIT_INDEX_FILE (pode valer a pena verificar se: printf '%s\n' "$GIT_INDEX_FILE" ).

Se o diretório do arquivo de índice não fosse gravável, você receberia uma mensagem de erro anterior:

fatal: Unable to create '/path/to/.git/index.lock': Permission denied

Podemos ter certeza de que o diretório que contém é gravável, já que você não recebeu esta mensagem de erro.

A mensagem de erro que você denunciou é emitida perto do final da atividade para git add . Infelizmente, o errno não é reportado por git add ; se tivesse sido relatado, poderíamos tentar adivinhar o problema com base no erro relatado.

git add mostra o erro que você reportou se tiver algum problema ao escrever o conteúdo do novo índice (o conteúdo é gravado no arquivo .lock ) ou quando ele tenta confirmar o bloqueio -file (renomeie o arquivo .lock para ocupar o lugar do arquivo de índice existente; isto é 'comprometer' a transação de arquivo de bloqueio, não o que git commit faz).

Problema de espaço em disco?

Como é o espaço livre no volume que contém seu arquivo de índice? Talvez esteja quase cheio. Eu tenho sido capaz de reproduzir a mensagem de erro quando o índice está em um volume que apenas o espaço livre suficiente para criar o arquivo .lock , mas não o suficiente para manter todo o conteúdo.

Questão "Flag"?

Existe algum sinalizador no arquivo de índice? No meu sistema, ter uchg (“nível de usuário imutável”) ou uappnd (“somente no nível de usuário anexado”) definido no arquivo de índice fará com que git add dê o mesmo mensagem de erro que você está recebendo. Verifique os sinalizadores com ls -lO no seu arquivo de índice (os sinalizadores são exibidos após o proprietário do grupo e antes do tamanho; ele mostrará - se não houver sinalizadores definidos). Se você vir sinalizadores, use os chflags comando para removê-los. Você pode querer investigar como os flags chegaram lá e se algum outro arquivo os possui (talvez com ls -lOR ).

Use ktrace

Se nenhuma das sugestões acima solicitar uma solução, você poderá quebrar ktrace e kdump para descobrir qual chamada de sistema está falhando imediatamente antes que a mensagem de erro seja impressa .

ktrace git add whatever
kdump | less
: Go to the bottom. Search for the error message.
: What CALL is RETurning -1? What is the reported errno?

Quando o volume está cheio, vejo isto:

 4728 git      CALL  write(0x9,0x116d24,0x18b0)
 4728 git      RET   write -1 errno 28 No space left on device
 4728 git      CALL  write(0x2,0xbfffcd00,0x26)
 4728 git      GIO   fd 2 wrote 38 bytes
      "fatal: Unable to write new index file
      "

Quando tenho um sinalizador incompatível, vejo isto:

 4742 git      CALL  rename(0x105bdd,0xbfffdfa8)
 4742 git      NAMI  ".git/index.lock"
 4742 git      NAMI  ".git/index"
 4742 git      RET   rename -1 errno 1 Operation not permitted
 4742 git      CALL  write(0x2,0xbfffcd40,0x26)
 4742 git      GIO   fd 2 wrote 38 bytes
      "fatal: Unable to write new index file
      "
    
por 29.09.2010 / 09:13