Solução 3
Isto é para usar um único diretório para vários projetos. Eu uso essa técnica para alguns projetos intimamente relacionados, onde muitas vezes preciso puxar alterações de um projeto para outro. É semelhante à idéia de galhos órfãos, mas os galhos não precisam ficar órfãos. Simplesmente inicie todos os projetos no mesmo estado de diretório vazio.
Iniciar todos os projetos de um diretório vazio confirmado
Não espere maravilhas com esta solução. A meu ver, você sempre terá aborrecimentos com arquivos não rastreados. O Git realmente não tem idéia do que fazer com eles e, se houver arquivos intermediários gerados por um compilador e ignorados pelo seu arquivo .gitignore, é provável que eles permaneçam suspensos por algum tempo, se você tentar trocar rapidamente entre - por exemplo - seu projeto de software e um projeto de tese de doutorado.
No entanto, aqui está o plano. Comece como você deve iniciar qualquer projeto git, confirmando o repositório vazio e inicie todos os seus projetos no mesmo estado de diretório vazio. Dessa forma, você tem certeza de que os dois lotes de arquivos são bastante independentes. Além disso, dê um nome adequado às suas filiais e não use apenas "master" preguiçosamente. Seus projetos precisam ser separados, portanto, forneça nomes apropriados.
As confirmações do Git (e, portanto, tags e branches) basicamente armazenam o estado de um diretório e seus subdiretórios e o Git não tem idéia se são partes do mesmo ou de diferentes projetos; portanto, não há problema em o git armazenar projetos diferentes no mesmo repositório. O problema é você limpar os arquivos não rastreados de um projeto ao usar outro ou separar os projetos posteriormente.
Crie um repositório vazio
cd some_empty_directory
git init
touch .gitignore
git add .gitignore
git commit -m empty
git tag EMPTY
Comece seus projetos de vazio.
Trabalhe em um projeto.
git branch software EMPTY
git checkout software
echo "array board[8,8] of piece" > chess.prog
git add chess.prog
git commit -m "chess program"
Iniciar outro projeto
quando você quiser.
git branch thesis EMPTY
git checkout thesis
echo "the meaning of meaning" > philosophy_doctorate.txt
git add philosophy_doctorate.txt
git commit -m "Ph.D"
Mudar para frente e para trás
Volte e avance entre os projetos sempre que quiser. Este exemplo remonta ao projeto de software de xadrez.
git checkout software
echo "while not end_of_game do make_move()" >> chess.prog
git add chess.prog
git commit -m "improved chess program"
Arquivos não rastreados são irritantes
No entanto, você ficará incomodado com arquivos não rastreados ao trocar entre projetos / ramificações.
touch untracked_software_file.prog
git checkout thesis
ls
philosophy_doctorate.txt untracked_software_file.prog
Não é um problema intransponível
Por definição, por definição, o git realmente não sabe o que fazer com arquivos não rastreados e cabe a você lidar com eles. Você pode impedir que arquivos não rastreados sejam transportados de uma ramificação para outra da seguinte maneira.
git checkout EMPTY
ls
untracked_software_file.prog
rm -r *
(directory is now really empty, apart from the repository stuff!)
git checkout thesis
ls
philosophy_doctorate.txt
Ao garantir que o diretório estivesse vazio antes de verificar nosso novo projeto, garantimos que não houvesse arquivos não rastreados pendentes de outro projeto.
Um refinamento
$ GIT_AUTHOR_DATE='2001-01-01:T01:01:01' GIT_COMMITTER_DATE='2001-01-01T01:01:01' git commit -m empty
Se as mesmas datas forem especificadas sempre que você confirmar um repositório vazio, as confirmações do repositório vazio criadas independentemente poderão ter o mesmo código SHA1. Isso permite que dois repositórios sejam criados independentemente e depois mesclados em uma única árvore com uma raiz comum em um repositório posteriormente.
Exemplo
# Create thesis repository.
# Merge existing chess repository branch into it
mkdir single_repo_for_thesis_and_chess
cd single_repo_for_thesis_and_chess
git init
touch .gitignore
git add .gitignore
GIT_AUTHOR_DATE='2001-01-01:T01:01:01' GIT_COMMITTER_DATE='2001-01-01:T01:01:01' git commit -m empty
git tag EMPTY
echo "the meaning of meaning" > thesis.txt
git add thesis.txt
git commit -m "Wrote my PH.D"
git branch -m master thesis
# It's as simple as this ...
git remote add chess ../chessrepository/.git
git fetch chess chess:chess
Resultado

Usar subdiretórios por projeto?
Também pode ajudar se você mantiver seus projetos em subdiretórios sempre que possível, por exemplo, em vez de ter arquivos
chess.prog
philosophy_doctorate.txt
ter
chess/chess.prog
thesis/philosophy_doctorate.txt
Nesse caso, seu arquivo de software não rastreado será chess/untracked_software_file.prog. Ao trabalhar no thesisdiretório, você não deve ser incomodado por arquivos de programa de xadrez não rastreados e poderá encontrar ocasiões em que poderá trabalhar feliz sem excluir arquivos não rastreados de outros projetos.
Além disso, se você deseja remover arquivos não rastreados de outros projetos, será mais rápido (e menos propenso a erros) despejar um diretório indesejado do que remover arquivos indesejados selecionando cada um deles.
Os nomes das filiais podem incluir caracteres '/'
Portanto, convém nomear seus ramos como
project1/master
project1/featureABC
project2/master
project2/featureXYZ