Решение 3
Это для использования одного каталога для нескольких проектов. Я использую эту технику для некоторых тесно связанных проектов, где мне часто приходится переносить изменения из одного проекта в другой. Это похоже на идею ветвей сирот, но ветви не должны быть сиротами. Просто запустите все проекты из одного и того же пустого состояния каталога.
Запустите все проекты из одного подтвержденного пустого каталога
Не ожидайте чудес от этого решения. На мой взгляд, у вас всегда будут неприятности с неотслеживаемыми файлами. Git на самом деле не имеет ни малейшего понятия, что с ними делать, и поэтому, если есть промежуточные файлы, сгенерированные компилятором и проигнорированные вашим файлом .gitignore, вполне вероятно, что они будут иногда зависать, если вы попытаетесь быстро поменяться местами. например, между вашим программным проектом и диссертацией на соискание ученой степени доктора философии.
Однако вот план. Начните так, как вам следует запустить любые проекты git, зафиксировав пустой репозиторий, а затем запустите все ваши проекты из того же состояния пустого каталога. Таким образом, вы уверены, что две партии файлов довольно независимы. Кроме того, дайте своим веткам правильное имя и не лениво просто использовать «мастер». Ваши проекты должны быть отдельными, поэтому дайте им соответствующие имена.
Коммиты Git (и, следовательно, теги и ветви) в основном хранят состояние каталога и его подкаталогов, и Git не знает, являются ли они частями одного и того же или разных проектов, поэтому на самом деле нет проблем с хранением разных проектов в одном и том же репозитории. Тогда проблема заключается в том, что вы очищаете неотслеживаемые файлы из одного проекта при использовании другого или разделяете проекты позже.
Создать пустой репозиторий
cd some_empty_directory
git init
touch .gitignore
git add .gitignore
git commit -m empty
git tag EMPTY
Начните свои проекты с нуля.
Работа над одним проектом.
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"
Начать другой проект
всякий раз, когда вам нравится.
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"
Переключаться назад и вперед
Возвращайтесь назад и вперед между проектами, когда захотите. Этот пример восходит к шахматному программному проекту.
git checkout software
echo "while not end_of_game do make_move()" >> chess.prog
git add chess.prog
git commit -m "improved chess program"
Неотслеживаемые файлы раздражают
Однако при переключении между проектами / ветвями вас будут раздражать неотслеживаемые файлы.
touch untracked_software_file.prog
git checkout thesis
ls
philosophy_doctorate.txt untracked_software_file.prog
Это не непреодолимая проблема
По определению, git не знает, что делать с неотслеживаемыми файлами, и вам решать, что с ними делать. Вы можете остановить перемещение неотслеживаемых файлов из одной ветви в другую следующим образом.
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
Убедившись в том, что каталог пуст, прежде чем проверять наш новый проект, мы убедились, что в другом проекте нет зависших неотслеживаемых файлов.
Изысканность
$ GIT_AUTHOR_DATE='2001-01-01:T01:01:01' GIT_COMMITTER_DATE='2001-01-01T01:01:01' git commit -m empty
Если при фиксации пустого репозитория указываются одинаковые даты, то независимо созданные пустые коммиты в репозитории могут иметь одинаковый код SHA1. Это позволяет независимо создавать два хранилища, а затем объединять их в одно дерево с общим корнем в одном хранилище.
пример
# 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
результат

Использовать подкаталоги для каждого проекта?
Это также может помочь, если вы по возможности храните свои проекты в подкаталогах, например, вместо файлов
chess.prog
philosophy_doctorate.txt
иметь
chess/chess.prog
thesis/philosophy_doctorate.txt
В этом случае ваш неотслеживаемый файл программного обеспечения будет chess/untracked_software_file.prog. При работе в thesisкаталоге вас не должны беспокоить неотслеживаемые файлы шахматных программ, и вы можете встретить случаи, когда вы сможете работать счастливо, не удаляя неотслеживаемые файлы из других проектов.
Кроме того, если вы хотите удалить неотслеживаемые файлы из других проектов, будет быстрее (и менее подвержено ошибкам) сбросить ненужный каталог, чем удалить ненужные файлы, выбрав каждый из них.
Имена ветвей могут включать символы '/'
Таким образом, вы можете назвать ваши ветви как
project1/master
project1/featureABC
project2/master
project2/featureXYZ