O que o índice Git contém exatamente e qual comando posso usar para visualizar o conteúdo do índice?
Atualizar
Obrigado por todas as suas respostas. Eu sei que o índice atua como uma área de preparação, e o que está comprometido está no índice e não na árvore de trabalho. Estou apenas curioso sobre o que consiste um objeto de índice. Eu acho que pode ser uma lista de nome de arquivo / diretório, pares SHA-1, uma espécie de árvore virtual, talvez?
Existe, na terminologia Git, algum comando de canalização que eu possa usar para listar o conteúdo do índice?
Respostas:
O livro Git contém um artigo sobre o que um índice inclui :
O problema do Racy git fornece mais alguns detalhes sobre essa estrutura:
Para ver mais, cf. " git / git / Documentation / technical / index-format.txt ":
O arquivo de índice Git tem o seguinte formato
mljrg comentários :
Como o índice representa o que está sendo rastreado e logo após um commit, o que está sendo rastreado é idêntico ao último commit (
git diff --cached
não retorna nada).Então,
git ls-files -s
lista todos os arquivos rastreados (nome do objeto, bits de modo e número do estágio na saída).Essa lista (de elemento rastreado) é inicializada com o conteúdo de uma confirmação.
Quando você alterna a ramificação, o conteúdo do índice é redefinido para o commit referenciado pela ramificação para a qual você acabou de alternar.
O Git 2.20 (quarto trimestre de 2018) adiciona uma tabela de deslocamento de entrada de índice (IEOT) :
Consulte commit 77ff112 , commit 3255089 , commit abb4bb8 , commit c780b9c , commit 3b1d9e0 , commit 371ed0d (10 de outubro de 2018) por Ben Peart (
benpeart
) .Veja commit 252d079 (26 de setembro de 2018) de Nguyễn Thái Ngọc Duy (
pclouds
) .(Mesclado por Junio C Hamano -
gitster
- in commit e27bfaa , 19 de outubro de 2018)Com a nova configuração de configuração index.threads , o carregamento do índice agora é mais rápido.
Como resultado ( do uso do IEOT ), confirme 7bd9631 para limpar a
read-cache.c load_cache_entries_threaded()
função do Git 2.23 (terceiro trimestre de 2019).Veja cometer 8373037 , cometer d713e88 , cometer d92349d , cometer 113c29a , cometer c95fc72 , cometer 7a2a721 , cometer c016579 , cometer be27fb7 , cometer 13a1781 , cometer 7bd9631 , cometer 3c1dce8 , cometer cf7a901 , cometer d64db5b , cometer 76a7bc0 (09 de maio de 2019) por Jeff King (
peff
) .(Incorporado por Junio C Hamano -
gitster
- in commit c0e78f7 , 13 jun 2019)fonte
Análise bit a bit
Decidi fazer um pequeno teste para entender melhor o formato e pesquisar alguns dos campos com mais detalhes.
Os resultados abaixo são os mesmos para as versões Git
1.8.5.2
e2.3
.Marquei pontos com os quais não tenho certeza / não encontrei
TODO
: fique à vontade para complementar esses pontos.Como outros mencionados, o índice é armazenado em
.git/index
, não como um objeto de árvore padrão, e seu formato é binário e documentado em: https://github.com/git/git/git/blob/master/Documentation/technical/index-format. TXTAs principais estruturas que definem o índice estão em cache.h , porque o índice é um cache para a criação de confirmações.
Configuração
Quando iniciamos um repositório de teste com:
O
.git
diretório se parece com:E se obtivermos o conteúdo do único objeto:
Nós recebemos
a
. Isso indica que:index
pontos para o conteúdo do arquivo, poisgit add b
criou um objeto blobanálise hd
Agora vamos ver o próprio índice:
Dá:
A seguir, concluiremos:
Primeiro vem o cabeçalho, definido em: struct cache_header :
44 49 52 43
:DIRC
. TODO: por que isso é necessário?00 00 00 02
: format version: 2. O formato do índice evoluiu com o tempo. Atualmente, existe uma versão até 4. O formato do índice não deve ser um problema ao colaborar entre computadores diferentes no GitHub, porque repositórios vazios não armazenam o índice: ele é gerado no momento do clone.00 00 00 01
: contagem de arquivos no índice: apenas umb
,.Em seguida, inicia uma lista de entradas de índice, definidas por struct cache_entry Aqui temos apenas uma. Contém:
vários metadados de arquivo: 8 bytes
ctime
, 8 bytesmtime
e 4 bytes: dispositivo, inode, modo, UID e GID.Observe como:
ctime
emtime
são os mesmos (54 09 76 e6 1d 81 6f c6
) esperados, pois não modificamos o arquivoOs primeiros bytes são segundos desde EPOCH em hexadecimal:
Dá:
Foi quando eu fiz esse exemplo.
Os segundos 4 bytes são nanossegundos.
UID e GID são
00 00 03 e8
1000 em hexadecimal: um valor comum para configurações de usuário único.Todos esses metadados, a maioria dos quais não está presente nos objetos da árvore, permitem ao Git verificar se um arquivo mudou rapidamente sem comparar o conteúdo inteiro.
no início da linha
30
::00 00 00 02
tamanho do arquivo: 2 bytes (a
e\n
deecho
)78 98 19 22 ... c1 99 4e 85
: 20 bytes SHA-1 sobre o conteúdo anterior da entrada. Observe que, de acordo com minhas experiências com o sinalizador assumido válido , os sinalizadores a seguir não são considerados neste SHA-1.Sinalizadores de 2 bytes:
00 01
1 bit: assume sinalizador válido. Minhas investigações indicam que esse sinalizador com nomes inadequados é onde
git update-index --assume-unchanged
armazena seu estado: https://stackoverflow.com/a/28657085/895245Sinalizador estendido de 1 bit. Determina se os sinalizadores estendidos estão presentes ou não. Deve estar
0
na versão 2 que não possui sinalizadores estendidos.Sinalizador de estágio de 2 bits usado durante a mesclagem. As etapas estão documentadas em
man git-merge
:0
: arquivo regular, não em conflito de mesclagem1
: base2
: nosso3
: delesDurante um conflito de mesclagem, todos os estágios de 1 a 3 são armazenados no índice para permitir operações como
git checkout --ours
.Se você
git add
, um estágio 0 é adicionado ao índice do caminho, e o Git saberá que o conflito foi marcado como resolvido. TODO: verifique isso.Comprimento de 12 bits do caminho a seguir
0 01
:: 1 byte somente desde que o caminho foib
Sinalizadores estendidos de 2 bytes. Somente significativo se o "sinalizador estendido" tiver sido definido nos sinalizadores básicos. FAÇAM.
62
(ASCIIb
): caminho de comprimento variável. Comprimento determinado nos sinalizadores anteriores, aqui apenas 1 byteb
,.Em seguida, vem
00
: 1-8 bytes de preenchimento zero, para que o caminho seja nulo e o índice termine em um múltiplo de 8 bytes. Isso acontece apenas antes da versão 4 do índice.Nenhuma extensão foi usada. O Git sabe disso porque não haveria espaço suficiente no arquivo para a soma de verificação.
Finalmente, há uma soma de verificação de 20 bytes
ee 33 c0 3a .. 09 ab 49 94
sobre o conteúdo do índice.fonte
git add
ao seuTODO
: você está correto. Se você tiver entradas de índice de alto estágio (um conflito) em um determinado caminho, quando você tivergit add
esse caminho, todas as entradas de índice de alto estágio serão removidas e a cópia do diretório de trabalho será adicionada no estágio0
. (Resolvendo o conflito).O índice Git é uma área intermediária entre o diretório ativo e o repositório. Você pode usar o índice para criar um conjunto de alterações que deseja confirmar juntos. Quando você cria uma confirmação, o que é confirmado é o que está atualmente neste índice, não o que está no seu diretório de trabalho.
Para ver o que está dentro do índice, emita o comando:
Ao executar o status do git, é possível ver quais arquivos estão preparados (atualmente no seu índice), quais foram modificados, mas ainda não estão preparados, e quais não estão completamente rastreados.
Você pode ler isso . Uma pesquisa no Google exibe muitos links, que devem ser bastante auto-suficientes.
fonte
git status
não lista todos os arquivos do índice. Ele lista apenas os arquivos que diferem entre o índice e o diretório de trabalho. Para ver todos os arquivos no índice, você precisa usargit ls-files
.git status
faz em arquivos de índice de lista verdade, independentemente de eles diferem entre o índice e workdir.git status
lista os arquivos que estão no índice, sim, mas não lista todos os arquivos no índice. Explicar comogit status
realmente funciona seria uma resposta benéfica para alguma pergunta, embora provavelmente não seja essa.git status
mostra o status da árvore de trabalho (diferença entre a árvore de trabalho e o índice). Na verdade, ele não mostra o índice. git-scm.com/docs/git-statusAqui está exatamente o que você precisava, use este comando.
$ binwalk index
fonte
O índice Git é um arquivo binário (geralmente mantido em
.git/index
) contendo uma lista classificada de nomes de caminhos, cada um com permissões e o SHA1 de um objeto de blob;git ls-files
pode mostrar o conteúdo do índice. Por favor, note que as palavrasindex
,stage
ecache
são a mesma coisa em Git: eles são usados de forma intercambiável.O índice Git, ou cache Git, possui três propriedades importantes:
Fonte :
fonte