Você pode descobrir o que o Git faz com um arquivo, vendo o que ele faz quando o adiciona ao índice. O índice é como um pré-commit. Com o índice confirmado, você pode usar git checkout
para trazer tudo o 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 sabe sobre esse arquivo. git ls-files
permite inspecionar seu índice ( saída semelhante a -s
impressões stat
):
$ git ls-files -s ./symlink
[nothing]
Agora, adicione o conteúdo do link simbólico ao armazenamento de objetos Git, adicionando-o ao índice. Quando você adiciona um arquivo ao índice, o Git armazena seu conteúdo no armazenamento de objetos 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 compactado que foi criado no armazenamento de objetos Git. Você pode examinar esse objeto se procurar na .git/objects/15/96f9db1b9610f238b78dd168ae33faa2dec15c
raiz do seu repositório. Este é o arquivo que o Git armazena no repositório, que você pode conferir posteriormente. Se você examinar esse arquivo, verá que ele é muito pequeno. Não armazena o conteúdo do arquivo vinculado.
(Note 120000
é o modo listado na ls-files
saída. Seria como 100644
um arquivo normal.)
Mas o que o Git faz com esse objeto quando você faz o check-out do repositório e do seu sistema de arquivos? Depende da core.symlinks
configuração. De man git-config
:
core.symlinks
Se falso, os links simbólicos são retirados como pequenos arquivos simples que contêm o texto do link.
Portanto, com um link simbólico no repositório, no check-out, você obtém um arquivo de texto com uma referência a um caminho completo do sistema de arquivos ou um link simbólico adequado, dependendo do valor da core.symlinks
configuração.
De qualquer forma, os dados referenciados pelo link simbólico não são armazenados no repositório.
.gitignore
vê o link simbólico como um arquivo, não uma pasta.