Pergunta

É o meu melhor estar indo para ser um shell script que substitui links simbólicos com cópias, ou há outra maneira de dizer Git para seguir links simbólicos?

PS:. Eu sei que não é muito seguro, mas eu só quero fazê-lo em poucos casos específicos

Foi útil?

Solução

NOTA: Este conselho está agora fora de moda como por comentário desde Git 1.6.1. Git usado para se comportar dessa maneira, e não faz mais.


Git por tentativas padrão para armazenar links simbólicos em vez de segui-los (para compactação, e é geralmente o que as pessoas querem).

No entanto, eu acidentalmente conseguiu obtê-lo para adicionar arquivos para além da ligação simbólica quando a ligação simbólica é um diretório.

ou seja:.

  /foo/
  /foo/baz
  /bar/foo --> /foo
  /bar/foo/baz

fazendo

 git add /bar/foo/baz

parecia trabalho quando eu tentei. Esse comportamento foi, porém, não desejada por mim no momento, então não posso dar-lhe informações além disso.

Outras dicas

O que eu fiz para adicionar para obter os arquivos dentro de um link simbólico para Git (eu não usar um link simbólico mas):

sudo mount --bind SOURCEDIRECTORY TARGETDIRECTORY

Faça isso de comando no diretório Git de gestão. TARGETDIRECTORY tem que ser criado antes do SOURCEDIRECTORY é montado para ele.

Ele funciona muito bem em Linux, mas não no OS X! Esse truque me ajudou com Subversion também. Eu usá-lo para incluir arquivos de uma conta Dropbox, onde um webdesigner faz sua / seu material.

Por que não criar links simbólicos o contrário? Significado em vez de ligar a partir do repositório Git para o diretório do aplicativo, basta ligar o contrário.

Por exemplo, digamos que estou a criação de um aplicativo instalado no ~/application que precisa de um config.conf arquivo de configuração:

  • acrescento config.conf ao meu repositório Git, por exemplo, na ~/repos/application/config.conf.
  • Em seguida, criar um link simbólico do ~/application executando ln -s ~/repos/application/config.conf.

Esta abordagem pode nem sempre trabalho, mas funcionou bem para mim até agora.

Use os links rígidos em vez. Isso é diferente de uma ligação suave (simbólico). Todos os programas, incluindo git tratará o arquivo como um arquivo regular. Note-se que o conteúdo pode ser modificado alterando qualquer a origem ou o destino.

no MacOS (antes 10,13 High Sierra)

Se você já tem git e Xcode instalado, instalar hardlink . É uma ferramenta microscópica para criar ligações fortes .

Para criar o link de disco rígido, simplesmente:

hln source destination

atualização MacOS High Sierra

Arquivo Does Apple System diretório suporte links de disco rígido?

Lista de hard links não são suportados por File Apple System. Todos os links de disco rígido de diretório são convertidos para links simbólicos ou aliases quando você converter de HFS + para formatos de volume APFS no MacOS.

De APFS FAQ sobre desenvolvedor .apple.com

Siga https://github.com/selkhateeb/hardlink/issues/31 por alternativas futuras.

No Linux e outros sabores de Unix

O comando ln pode fazer ligações fortes:

ln source destination

No Windows (Vista, 7, 8, ...)

Alguém sugeriu usar mklink criar uma junção no Windows, mas eu não tentei :

mklink /j "source" "destination"

Esta é uma pré-commit gancho que substitui os blobs link simbólico no índice, com o conteúdo desses links simbólicos.

Coloque isso no .git/hooks/pre-commit, e torná-lo executável:

#!/bin/sh
# (replace "find ." with "find ./<path>" below, to work with only specific paths)

# (these lines are really all one line, on multiple lines for clarity)
# ...find symlinks which do not dereference to directories...
find . -type l -exec test '!' -d {} ';' -print -exec sh -c \
# ...remove the symlink blob, and add the content diff, to the index/cache
    'git rm --cached "$1"; diff -au /dev/null "$1" | git apply --cached -p1 -' \
# ...and call out to "sh".
    "process_links_to_nondir" {} ';'

# the end

Notas

Nós usamos funcionalidade compatível com POSIX, tanto quanto possível; no entanto, diff -a não é compatível com POSIX, possivelmente, entre outras coisas.

Pode haver alguns erros / erros neste código, apesar de ter sido testado um pouco.

I usado para adicionar arquivos além de links simbólicos por algum tempo agora. Isto costumava funcionar muito bem, sem fazer quaisquer arranjos especiais. Desde que eu atualizado para Git 1.6.1, isso não funciona mais.

Você pode ser capaz de mudar para o Git 1.6.0 para fazer este trabalho. Espero que uma futura versão do Git terá um sinalizador para git-add permitindo que ele siga links simbólicos novamente.

Eu cansei de toda solução aqui quer ser ultrapassada ou exigindo raiz, então Fiz uma solução baseada em LD_PRELOAD (Linux somente).

Ele conecta em partes internas do Git, substituindo o 'este é um link simbólico? função, permitindo ligações simbólicas para ser tratado como os seus conteúdos. Por padrão, todos os links para fora do repo está embutido; veja o link para mais detalhes.

Com Git 2.3.2+ (Q1 2015), há um outro caso em que Git irá não follow link simbólico mais: veja cometer e0d201b por Junio ??C Hamano (gitster) (principal mantenedor git)

apply: não toque um arquivo além de um link simbólico

Porque Git rastreia links simbólicos como links simbólicos, um caminho que tem um link simbólico em sua parte principal (por exemplo path/to/dir/file, onde path/to/dir é um link simbólico para outro lugar, seja dentro ou fora da árvore de trabalho) não pode nunca aparecer em um patch que se aplica validamente, a menos que o mesmo remendo remove primeiro a ligação simbólica para permitir um diretório a ser criado lá.

detectar e rejeitar tal remendo um.

Da mesma forma, quando uma entrada cria um path/to/dir link simbólico e, em seguida, cria uma path/to/dir/file arquivo, precisamos marcá-lo como um erro sem realmente criar path/to/dir ligação simbólica no sistema de arquivos.

Em vez disso, para qualquer adesivo na entrada que as folhas de um caminho (isto é, um não deleção) no resultado, podemos verificar todos os caminhos que conduzem contra a árvore resultando que o adesivo criaria por inspeccionar todas as amostras na entrada e, em seguida, o alvo de aplicação do sistema (seja o índice ou a árvore de trabalho).

Desta forma, nós:

  • pegar um mal ou um erro de adicionar um path/to/dir link simbólico e uma path/to/dir/file arquivo ao mesmo tempo,
  • , permitindo um patch válido que remove um link path/to/dir simbólico e, em seguida, adiciona um path/to/dir/file arquivo.

Isso significa que, nesse caso, a mensagem de erro não será um genérico como "%s: patch does not apply", mas um mais específico:

affected file '%s' is beyond a symbolic link

Hmmm, mount --bind não parece trabalhar em Darwin.

Alguém tem um truque que faz?

[editado]

OK, eu encontrei a resposta no Mac OS X é fazer uma hardlink. Só que essa API não é exposto via ln, então você tem que usar o seu próprio pequeno programa para fazer isso. Aqui está um link para esse programa:

Criando diretório links de disco rígido no Mac OS X

Aproveite!

Em MacOS (eu tenho Mojave / 10,14, git versão 2.7.1), o uso bindfs.

brew install bindfs

cd /path/to/git_controlled_dir

mkdir local_copy_dir

bindfs <source_dir> local_copy_dir

Tem sido sugerido por outros comentários, mas não claramente previsto no outras respostas. Esperemos que este poupa alguém algum tempo.

Eu estou usando Git 1.5.4.3 e está seguindo o link simbólico passada se ele tem uma barra. Por exemplo.

# Adds the symlink itself
$ git add symlink

# Follows symlink and adds the denoted directory's contents
$ git add symlink/

A conversão de links simbólicos poderia ser útil. Link em uma pasta Git em vez de um link simbólico por um script .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top