Pergunta

Eu tenho um repositório Git media onde eu estou mantendo todos os meus arquivos e scripts que eu vou usar em vários projetos mestre JavaScript e CSS.

Se eu criar um novo projeto que está em seu próprio repositório Git, como faço para usar arquivos JavaScript do repositório minha mídia no meu novo projeto de uma forma que torna então eu não tenho que atualizar ambas as cópias do script quando I fazer mudanças?

Foi útil?

Solução

A chave é git submódulos .

Iniciar a leitura do capítulo submódulos do Git comunidade do livro ou de manual do usuário

Digamos que você tenha repositório Projeto1, project2, e MEDIA ...

cd /path/to/PROJECT1
git submodule add ssh://path.to.repo/MEDIA
git commit -m "Added Media submodule"

Repita no outro repo ...

Agora, o legal é, que a qualquer momento você confirmar as alterações para a mídia, você pode fazer isso:

cd /path/to/PROJECT2/MEDIA
git pull
cd ..
git add MEDIA
git commit -m "Upgraded media to version XYZ"

Isso só registrou o fato de que o sub-módulo de mídia dentro de project2 é agora na versão XYZ.

Ele lhe dá o controle de 100% sobre o que versão do Media cada usos do projeto. git submódulos são grandes, mas você precisa experimentar e aprender sobre eles.

Com grande poder vem grande chance de ser mordido na garupa.

Outras dicas

Considere o uso sub em vez de submódulos, que fará sua vida utilizadores compromissadas muito mais fácil. Você pode encontrar guia mais detalhado na Pro Git livro .

Se eu entender o seu problema assim que você quer as coisas seguintes:

  1. Tenha os seus arquivos de mídia armazenados em um repositório git único, que é usado por muitos projetos
  2. Se você modificar um arquivo de mídia em qualquer um dos projetos em sua máquina local, ele deve aparecer imediatamente em todos os outros projetos (para que você não quer cometer + pressão + puxar o tempo todo)

Infelizmente não há nenhuma solução definitiva para o que você quer, mas há algumas coisas pelas quais você pode tornar sua vida mais fácil.

Em primeiro lugar você deve decidir uma coisa importante: você deseja armazenar para cada versão em seu projeto repositório uma referência para a versão dos arquivos de mídia? Por exemplo, se você tem um projeto chamado example.com, você precisa saber qual Style.css que costumava 2 semanas atrás, ou o mais recente é sempre (ou quase) o melhor?

Se você não precisa saber que, a solução é fácil:

  1. criar um repositório para os arquivos de mídia e um para cada projeto
  2. criar um link simbólico em seus projetos que apontam para o repositório de media clonado no local. Você pode criar um link simbólico relativa (por exemplo ../media) e assumir que todo mundo vai fazer o checkout do projeto para que o diretório de mídia está no mesmo lugar, ou escreva o nome do link simbólico em .gitignore, e todo mundo pode decidir onde ele / ela coloca os arquivos de mídia.

Na maioria dos casos, no entanto, você quer saber esta informação de versão. Neste caso, você tem duas opções:

  1. loja cada projeto em um grande repositório. A vantagem desta solução é que você terá apenas 1 cópia do repositório de mídia. A grande desvantagem é que é muito mais difícil para alternar entre as versões de projeto (se você check-out para uma versão diferente você sempre irá modificar todos os projetos)

  2. Use submódulos (como explicado na resposta 1). Desta forma, você irá armazenar os arquivos de mídia em um repositório, e os projetos conterá apenas uma referência a uma versão específica media compromissadas. Mas desta forma você normalmente terá muitas cópias locais do repositório de mídia, e você não pode facilmente modificar um arquivo de mídia em todos os projetos.

Se eu fosse você eu provavelmente escolheria a primeira ou terceira solução (links simbólicos ou submódulos). Se você optar por usar submódulos você ainda pode fazer um monte de coisas para tornar sua vida mais fácil:

  1. Antes de cometer você pode renomear o diretório submodule e colocar um link simbólico para um diretório de mídia comum. Quando estiver pronto para cometer, você pode remover o link simbólico e remover a parte de trás submodule, e depois cometer.

  2. Você pode adicionar um de sua cópia do repositório de mídia como um repositório remoto para todos os seus projetos.

Você pode adicionar diretórios locais como desta forma remota:

cd /my/project2/media
git remote add project1 /my/project1/media

Se você modificar um arquivo em / meus / project1 / mídia, você pode cometê-lo e puxá-lo de / my / Projeto2 / mídia sem empurrá-lo para um servidor remoto:

cd /my/project1/media
git commit -a -m "message"
cd /my/project2/media
git pull project1 master

Você é livre para remover esses commits mais tarde (com git reset) porque você não compartilhá-las com outros usuários.

Eu tive problemas com subárvores e submódulos que as outras respostas sugerem ... principalmente porque eu estou usando SourceTree e parece bastante buggy.

Em vez disso, acabei usando links simbólicos e que parece funcionar bem, então eu estou postando aqui como uma alternativa possível.

Há um guia completo aqui: http://www.howtogeek.com/howto/16226/complete-guide-to-symbolic-links-symlinks-on-windows-or-linux/

Mas, basicamente você só precisa mklink os dois caminhos em um prompt de comando elevado. Certifique-se de usar o J duro ligação prefixo /. Algo ao longo destas linhas: MKLINK / J C: \ projectos \ MainProject \ encaixes C: \ projectos \ SomePlugin

Você também pode usar caminhos de pasta relativos e colocá-lo em um bastão para ser executado por cada pessoa quando eles primeiro verificar se o seu projeto.

Exemplo: mklink / J. \ Ativos \ TaqtileTools .. \ TaqtileHoloTools

Uma vez que a pasta tem sido associada pode ser necessário ignorar a pasta dentro do seu repositório principal que está fazendo referência a ele. Caso contrário, você é bom para ir.

Nota eu tiver excluído minha resposta duplicado de outro cargo como esse post foi marcado como uma pergunta duplicado para este.

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