Como o Git manipula links simbólicos?


1 Answers

TL; DR: Os dados referenciados pelo symlink não são armazenados no repositório.

Você pode descobrir o que o Git faz com um arquivo, vendo o que ele faz quando você o adiciona ao índice. O índice é como um pré-commit. Com o índice confirmado, você pode usar o git checkout para trazer tudo que estava no índice de volta ao diretório de trabalho. Então, o que o Git faz quando você adiciona um link simbólico ao índice?

Para descobrir, primeiro, faça um link simbólico:

$ ln -s /Path/referenced/by/symlink symlink

O Git ainda não conhece esse arquivo. git ls-files permite que você inspecione seu índice ( -s imprime a saída parecida com stat ):

$ git ls-files -s ./symlink
$

Agora, adicione o conteúdo do link simbólico ao repositório de objetos do Git, adicionando-o ao índice. Quando você adiciona um arquivo ao índice, o Git armazena seu conteúdo no repositório de objetos do Git.

$ git add ./symlink

Então, o que foi adicionado?

$ git ls-files -s ./symlink
120000 1596f9db1b9610f238b78dd168ae33faa2dec15c 0       symlink
$

O hash é uma referência ao objeto empacotado que foi criado no repositório de objetos do Git. Você pode examinar este objeto se você olhar em .git/objects/15/96f9db1b9610f238b78dd168ae33faa2dec15c .

O 120000 é o modo de arquivo. Seria algo como 100644 para um arquivo regular e é o modo especial para links. Do man git-config :

core.symlinks

Se falso, links simbólicos são verificados como pequenos arquivos simples que contêm o texto do link. git-update-index (1) e git-add (1) não irão alterar o tipo gravado para o arquivo regular.

Use git cat-file -p para imprimir bastante o conteúdo:

$ git cat-file -p 1596f9db1
/Path/referenced/by/symlink

Então, é isso que o Git faz com um link simbólico: quando você faz o git checkout do link simbólico, você obtém um arquivo de texto com uma referência a um caminho completo do sistema de arquivos, ou um symlink, dependendo da configuração. Os dados referenciados pelo symlink não são armazenados no repositório.

git version-control symlink

Se eu tenho um arquivo ou diretório que é um link simbólico e eu o confirmo em um repositório Git, o que acontece com ele?

Eu suponho que ele deixa como um link simbólico até que o arquivo seja excluído e, em seguida, se você puxar o arquivo de volta de uma versão antiga, apenas cria um arquivo normal.

O que faz quando eu apago o arquivo que ele referencia? Isso apenas compromete o link pendente?



Related