Se entendi bem o seu problema, você deseja o seguinte:
- Tenha seus arquivos de mídia armazenados em um único repositório git, usado por muitos projetos
- Se você modificar um arquivo de mídia em qualquer um dos projetos em sua máquina local, ele deverá aparecer imediatamente em todos os outros projetos (para que você não queira confirmar + empurrar + puxar o tempo todo)
Infelizmente, não existe uma solução definitiva para o que você deseja, mas existem algumas coisas pelas quais você pode facilitar sua vida.
Primeiro, você deve decidir uma coisa importante: deseja armazenar para cada versão no repositório do projeto uma referência à versão dos arquivos de mídia? Por exemplo, se você tem um projeto chamado example.com, precisa saber qual style.css foi usado há 2 semanas ou o mais recente é sempre (ou principalmente) o melhor?
Se você não precisa saber disso, a solução é fácil:
- crie um repositório para os arquivos de mídia e um para cada projeto
- crie um link simbólico em seus projetos que aponte para o repositório de mídia clonado localmente. Você pode criar um link simbólico relativo (por exemplo, ../media) e assumir que todos farão o check-out do projeto para que o diretório de mídia esteja no mesmo local ou escrever o nome do link simbólico em .gitignore, e todos poderão decidir onde ele coloca os arquivos de mídia.
Na maioria dos casos, no entanto, você deseja conhecer essas informações de versão. Nesse caso, você tem duas opções:
Armazene todos os projetos 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 alternar entre versões do projeto (se você fizer o checkout para uma versão diferente, sempre modificará TODOS os projetos)
Use submódulos (como explicado na resposta 1). Dessa forma, você armazenará os arquivos de mídia em um repositório e os projetos conterão apenas uma referência a uma versão específica de repositório de mídia. Porém, dessa forma, você normalmente terá muitas cópias locais do repositório de mídia e não poderá modificar facilmente um arquivo de mídia em todos os projetos.
Se eu fosse você, provavelmente escolheria a primeira ou a terceira solução (links ou submódulos simbólicos). Se você optar por usar submódulos, ainda poderá fazer muitas coisas para facilitar sua vida:
Antes de confirmar, você pode renomear o diretório do submódulo e colocar um link simbólico em um diretório de mídia comum. Quando estiver pronto para confirmar, você pode remover o link simbólico e remover o submódulo novamente e confirmar.
Você pode adicionar uma de sua cópia do repositório de mídia como um repositório remoto a todos os seus projetos.
Você pode adicionar diretórios locais como um controle remoto desta maneira:
cd /my/project2/media
git remote add project1 /my/project1/media
Se você modificar um arquivo em / my / project1 / media, poderá confirmá-lo e retirá-lo de / my / project2 / media sem enviá-lo para um servidor remoto:
cd /my/project1/media
git commit -a -m "message"
cd /my/project2/media
git pull project1 master
Você pode remover esses commits mais tarde (com redefinição do git) porque não os compartilhou com outros usuários.