Nossos desenvolvedores usam uma mistura de sistemas operacionais baseados em Windows e Unix. Portanto, links simbólicos criados em máquinas Unix se tornam um problema para desenvolvedores do Windows. No Windows (msysgit), o link simbólico é convertido em um arquivo de texto com um caminho para o arquivo para o qual aponta. Em vez disso, gostaria de converter o link simbólico em um link simbólico real do Windows.
A solução ( atualizada ) que tenho para isso é:
- Escreva um script pós-checkout que procure recursivamente os arquivos de texto "link simbólico".
- Substitua-os pelo link simbólico do Windows (usando mklink) com o mesmo nome e extensão que o "link simbólico" fictício
- Ignore o link simbólico do Windows adicionando entrada em .git / info / exclude
Eu não implementei isso, mas acredito que essa é uma abordagem sólida para esse problema.
Questões:
- Quais são as desvantagens que você vê nessa abordagem?
- Esse script pós-checkout é implementável? ou seja, posso descobrir recursivamente os arquivos fictícios "link simbólico" que o git cria?
- Alguém já trabalhou nesse script?
Respostas:
Você pode encontrar os links simbólicos procurando arquivos que possuam um modo de
120000
, possivelmente com este comando:Depois de substituir os links, recomendo marcá-los como inalterados
git update-index --assume-unchanged
, em vez de listá-los.git/info/exclude
.fonte
git ls-files -s | grep '^12' | cut -f2
(segunda coluna delimitada por tabulação; outras colunas são delimitadas por espaço)for f in `git ls-files -s | awk '/120000/{print $4}'`; do git update-index --assume-unchanged $f; done
Eu estava fazendo essa mesma pergunta há algum tempo (não aqui, apenas em geral) e acabei encontrando uma solução muito semelhante à proposta do OP. Primeiro, fornecerei respostas diretas às perguntas 1 2 e 3 e depois publicarei a solução que acabei usando.
git checkout
passo literal , mas a solução abaixo atendeu às minhas necessidades o suficiente para que um script literal de pós-checkout não fosse necessário.A solução:
Nossos desenvolvedores estão praticamente na mesma situação dos OP: uma mistura de hosts do Windows e do tipo Unix, repositórios e sub-módulos com muitos links simbólicos git e nenhum suporte nativo (ainda) na versão de lançamento do MsysGit para lidar com esses links simbólicos de forma inteligente nos hosts Windows .
Obrigado a Josh Lee por apontar o fato de que o git comete links simbólicos com um modo de arquivo especial
120000
. Com essas informações, é possível adicionar alguns aliases do git que permitem a criação e manipulação de links simbólicos do git nos hosts do Windows.Criando links simbólicos git no Windows
Uso:, em
git add-symlink <source_file_or_dir> <target_symlink>
que o argumento correspondente ao arquivo ou diretório de origem deve assumir a forma de um caminho relativo ao link simbólico de destino. Você pode usar esse alias da mesma maneira que usaria normalmenteln
.Por exemplo, a árvore do repositório:
Pode ser criado no Windows da seguinte maneira:
Substituindo links simbólicos git por links físicos + junções NTFS
Uso:
Esse alias pode remover os links simbólicos do git um por um ou todos de uma vez de uma só vez. Os links simbólicos serão substituídos por links físicos NTFS (no caso de arquivos) ou junções NTFS (no caso de diretórios). O benefício do uso de links físicos + junções sobre links simbólicos NTFS "verdadeiros" é que não são necessárias permissões UAC elevadas para que elas sejam criadas.
Para remover links simbólicos dos submódulos, use o suporte interno do git para iterá-los:
Mas, para toda ação drástica como essa, é bom ter uma reversão ...
Restaurando links simbólicos do git no Windows
Uso
git checkout-symlinks [symlink] [symlink] [...]
:, que desfazgit rm-symlinks
, restaura efetivamente o repositório para seu estado natural (exceto as alterações, que devem permanecer intactas).E para submódulos:
Limitações:
Diretórios / arquivos / links simbólicos com espaços em seus caminhos devem funcionar. Mas guias ou novas linhas? YMMV ... (Com isso eu quero dizer: não faça isso, porque não vai funcionar.)
Se você ou outras pessoas esquecerem
git checkout-symlinks
antes de fazer algo com conseqüências potencialmente abrangentesgit add -A
, o repositório local pode acabar em um estado poluído.Usando nosso "repositório de exemplo" de antes:
Opa ...
Por esse motivo, é bom incluir esses aliases como etapas a serem executadas para os usuários do Windows antes e depois da criação de um projeto, em vez de após o checkout ou antes do envio. Mas cada situação é diferente. Esses aliases foram úteis o suficiente para mim, não sendo necessária uma solução verdadeira após o checkout.
Espero que ajude!
Referências:
http://git-scm.com/book/en/Git-Internals-Git-Objects
http://technet.microsoft.com/en-us/library/cc753194
Última atualização: 2019-03-13
mklink
chamadas, é claro) - não mais Bashisms !add-symlink
alias agora funciona mais como ln (1) e pode ser usado em qualquer diretório do repositório, não apenas no diretório raiz do repositório.rm-symlink
alias (singular) foi substituído pelorm-symlinks
alias (plural), que agora aceita vários argumentos (ou nenhum argumento), que encontra todos os links simbólicos em todo o repositório, como antes) para transformar seletivamente os links simbólicos do git em links físicos NTFS + junções .checkout-symlinks
alias também foi atualizado para aceitar vários argumentos (ou nenhum, == tudo) para reversão seletiva das transformações mencionadas acima.Nota final: Embora eu tenha testado o carregamento e a execução desses aliases usando o Bash 3.2 (e até 3.1) para aqueles que ainda podem estar presos a versões antigas por várias razões, lembre-se de que versões tão antigas como essas são notórias por seu analisador insetos. Se você tiver problemas ao tentar instalar qualquer um desses aliases, a primeira coisa a se considerar é atualizar seu shell (para o Bash, verifique a versão com CTRL + X, CTRL + V). Como alternativa, se você estiver tentando instalá-los colando-os no emulador de terminal, poderá ter mais sorte colando-os em um arquivo e adquiri-lo, por exemplo, como
Boa sorte!
fonte
git add-symlink
receita foi extraordinariamente valiosa para mim. Muito Obrigado.A versão mais recente do git scm (testet 2.11.1) permite ativar links simbólicos. Mas você precisa clonar o repositório com os links simbólicos novamente
git clone -c core.symlinks=true <URL>
. Você precisa executar este comando com direitos de administrador. Também é possível criar links simbólicos no Windows com o mklink. Confira o wiki .fonte
tslint.json
arquivo que faz referência ao arquivo no diretório pai ainda contém../tslint.json
. Pena, porque realmente parecia a mais fácil de todas as soluções propostas lá.git clone -c core.symlinks=true <URL>
e no Windows, você deve executá-lo com direitos de administrador.Ele deve ser implementado no msysgit, mas existem duas desvantagens:
Fiz uma pesquisa rápida e há trabalho sendo feito ativamente sobre isso, veja o número 224 .
fonte
então, como as coisas mudaram com o GIT desde que muitas dessas respostas foram postadas aqui, estão as instruções corretas para que os links simbólicos funcionem corretamente no Windows a partir de
AGOSTO 2018
1. Verifique se o git está instalado com o suporte de link simbólico
2. Diga ao Bash para criar links físicos em vez de links simbólicos
EDIT - (pasta git) /etc/bash.bashrc
ADICIONAR AO INFERIOR -
MSYS=winsymlinks:nativestrict
3. Defina git config para usar links simbólicos
ou
NOTA: Tentei adicionar isso à configuração global do git e, no momento, ele não está funcionando para mim, então eu recomendo adicionar isso a cada repo ...
4. puxe o repositório
NOTA: A menos que você tenha ativado o modo de desenvolvedor na versão mais recente do Windows 10, é necessário executar o bash como administrador para criar links simbólicos
5. Redefinir todos os links simbólicos (opcional) Se você possui um repositório existente ou está usando sub-módulos, pode achar que os links simbólicos não estão sendo criados corretamente. Para atualizar todos os links simbólicos no repositório, você pode executar esses comandos.
OBSERVAÇÃO: isso redefinirá todas as alterações desde a última confirmação, portanto, confirme primeiro
fonte
Resposta curta: agora eles são compatíveis, se você puder ativar o modo de desenvolvedor.
De https://blogs.windows.com/buildingapps/2016/12/02/symlinks-windows-10/
Fácil de ignorar com todos os outros anúncios da "Atualização do criador", mas se você ativar o Modo de desenvolvedor, poderá criar links simbólicos sem privilégios elevados. Talvez você precise reinstalar o git e verifique se o suporte ao link simbólico está ativado, pois não é por padrão.
fonte
gpedit.msc
->Local Computer Policy
->Computer Configuration
->Windows Settings
->Security Settings
->Local Policies
->User Rights Assignment
tem sido a maneira canônica de atribuir direitos de usuárioSeCreateSymbolicLink
e amigos por muito tempo. Diferententrights.exe
do Resource Kit ou do PowerShell ...Resposta 2020
mklink
permissõesgit config --global core.symlinks true
A troca de ramificações forçará a recriação de links simbólicos ausentes.
Cuidado, o suporte ao Symlinks no Windows com outros clientes Git não está completo. Notavelmente GitKraken.
fonte
Eu sugiro que você não use links simbólicos no repositório '. Armazene o conteúdo real dentro do repositório 'e coloque links simbólicos ao lado do repositório' que apontam para o conteúdo.
Digamos que você esteja usando um repositório para comparar a hospedagem do seu site no * nix com a hospedagem no win. Armazene o conteúdo em seu repo ', digamos
/httpRepoContent
ec:\httpRepoContent
sendo esta a pasta que é sincronizado via GIT, SVN etc.Em seguida, substitua a pasta de conteúdo do seu servidor web (
/var/www
ec:\program files\web server\www
{os nomes não importam, edite se necessário}) por um link simbólico para o conteúdo do seu repositório '. Os servidores da Web verão o conteúdo como realmente no lugar 'certo', mas você poderá usar seu controle de origem.No entanto, se você precisar usar links simbólicos no repositório ', precisará procurar algo como algum tipo de script de confirmação pré / pós. Eu sei que você pode usá-los para fazer coisas, como analisar arquivos de código por meio de um formatador, por exemplo, para que seja possível converter os links simbólicos entre plataformas.
se alguém conhece um bom lugar para aprender como executar esses scripts para os controles de origem comuns, SVN GIT MG, adicione um comentário.
fonte
Para aqueles que usam o CygWin no Vista, Win7 ou superior, o
git
comando nativo pode criar links simbólicos "adequados" que são reconhecidos por aplicativos do Windows, como o Android Studio . Você só precisa definir aCYGWIN
variável de ambiente para incluirwinsymlinks:native
ouwinsymlinks:nativestrict
como tal:A desvantagem disso (e uma significativa) é que o shell do CygWin precisa ser "Executar como Administrador" para ter as permissões de SO necessárias para criar esse tipo de links simbólicos. Porém, uma vez criados, nenhuma permissão especial é necessária para usá- los. Desde que não sejam alterados no repositório por outro desenvolvedor,
git
partir de então funcionará bem com permissões normais de usuário.Pessoalmente, eu uso apenas isso para links simbólicos que são navegados por aplicativos do Windows (ou seja, não CygWin) devido a essa dificuldade adicional.
Para obter mais informações sobre esta opção, consulte esta pergunta do SO: Como fazer um link simbólico com o cygwin no Windows 7
fonte
Aqui está um script em lote para converter links simbólicos no repositório, apenas para arquivos, com base na resposta de Josh Lee. O script com alguma verificação adicional dos direitos de administrador está em https://gist.github.com/Quazistax/8daf09080bf54b4c7641 .
fonte
Eu uso links sym o tempo todo entre a raiz do documento e o diretório git repo. Eu gosto de mantê-los separados. No Windows eu uso a opção mklink / j. A junção parece permitir que o git se comporte normalmente:
>mklink /j <location(path) of link> <source of link>
por exemplo:
>mklink /j c:\gitRepos\Posts C:\Bitnami\wamp\apache2\htdocs\Posts
fonte
Eu estava procurando uma solução fácil para lidar com os links simbólicos unix no Windows. Muito obrigado pelos aliases do Git acima. Há uma pequena otimização que pode ser feita nos rm-symlinks, para que não exclua os arquivos na pasta de destino, caso o alias seja executado uma segunda vez acidentalmente. Observe a nova condição if no loop para garantir que o arquivo ainda não seja um link para um diretório antes da execução da lógica.
fonte
Um truque simples que usamos é chamar apenas
git add --all
duas vezes seguidas.Por exemplo, nosso script de confirmação do Windows 7 chama:
A primeira adição trata o link como texto e adiciona as pastas para exclusão.
A segunda adição percorre o link corretamente e desfaz a exclusão restaurando os arquivos.
É menos elegante do que algumas das outras soluções propostas, mas é uma correção simples para alguns de nossos ambientes legados que adicionaram links simbólicos.
fonte