Rozwiązanie 3
Służy do korzystania z jednego katalogu dla wielu projektów. Używam tej techniki do niektórych ściśle powiązanych projektów, w których często muszę wprowadzać zmiany z jednego projektu do drugiego. Jest podobny do pomysłu osieroconych gałęzi, ale gałęzie nie muszą być osierocone. Po prostu uruchom wszystkie projekty z tego samego stanu pustego katalogu.
Rozpocznij wszystkie projekty z jednego zatwierdzonego pustego katalogu
Nie oczekuj cudów od tego rozwiązania. Jak widzę, zawsze będziesz mieć problemy z nieśledzonymi plikami. Git tak naprawdę nie ma pojęcia, co z nimi zrobić, więc jeśli istnieją pliki pośrednie wygenerowane przez kompilator i zignorowane przez plik .gitignore, jest prawdopodobne, że przez jakiś czas będą zawieszane, jeśli spróbujesz szybko zamienić między - na przykład - projektem oprogramowania a projektem pracy doktorskiej.
Jednak tutaj jest plan. Rozpocznij, tak jak powinieneś rozpocząć wszelkie projekty git, zatwierdzając puste repozytorium, a następnie uruchom wszystkie projekty z tego samego stanu pustego katalogu. W ten sposób masz pewność, że dwie partie plików są dość niezależne. Nadaj też swoim gałęziom odpowiednią nazwę i nie leniwie używaj po prostu „master”. Twoje projekty muszą być oddzielne, więc nadaj im odpowiednie nazwy.
Git commits (a więc tagi i gałęzie) zasadniczo przechowują stan katalogu i jego podkatalogów, a Git nie ma pojęcia, czy są to części tego samego czy innego projektu, więc naprawdę nie ma problemu z przechowywaniem różnych projektów w tym samym repozytorium. Problem polega na tym, aby wyczyścić nieśledzone pliki z jednego projektu podczas korzystania z innego lub oddzielić projekty później.
Utwórz puste repozytorium
cd some_empty_directory
git init
touch .gitignore
git add .gitignore
git commit -m empty
git tag EMPTY
Zacznij swoje projekty od pustych.
Pracuj nad jednym projektem.
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"
Rozpocznij kolejny projekt
kiedykolwiek chcesz.
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"
Przełączaj się tam iz powrotem
W dowolnym momencie możesz przechodzić między projektami. Ten przykład wraca do projektu oprogramowania szachowego.
git checkout software
echo "while not end_of_game do make_move()" >> chess.prog
git add chess.prog
git commit -m "improved chess program"
Nieśledzone pliki są denerwujące
Podczas wymiany między projektami / oddziałami będziesz jednak zirytowany nieśledzonymi plikami.
touch untracked_software_file.prog
git checkout thesis
ls
philosophy_doctorate.txt untracked_software_file.prog
To nie jest problem nie do pokonania
Z definicji, git tak naprawdę nie wie, co zrobić z nieśledzonymi plikami i od Ciebie zależy, jak sobie z nimi poradzić. Możesz zatrzymać przenoszenie nieśledzonych plików z jednej gałęzi do drugiej w następujący sposób.
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
Zapewniając, że katalog jest pusty przed sprawdzeniem naszego nowego projektu, upewniliśmy się, że nie ma zawieszonych nieśledzonych plików z innego projektu.
Wyrafinowanie
$ GIT_AUTHOR_DATE='2001-01-01:T01:01:01' GIT_COMMITTER_DATE='2001-01-01T01:01:01' git commit -m empty
Jeśli te same daty zostaną określone przy każdym zatwierdzeniu pustego repozytorium, wówczas niezależnie utworzone zatwierdzenia pustego repozytorium mogą mieć ten sam kod SHA1. Umożliwia to niezależne utworzenie dwóch repozytoriów, a następnie scalenie ich w jedno drzewo ze wspólnym katalogiem głównym w jednym repozytorium później.
Przykład
# 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
Wynik

Używasz podkatalogów na projekt?
Może to również pomóc, jeśli przechowujesz swoje projekty w podkatalogach, jeśli to możliwe, np. Zamiast plików
chess.prog
philosophy_doctorate.txt
mieć
chess/chess.prog
thesis/philosophy_doctorate.txt
W takim przypadku będzie to nieśledzony plik oprogramowania chess/untracked_software_file.prog. Podczas pracy w thesiskatalogu nie powinny przeszkadzać nie śledzone pliki programów szachowych i mogą się zdarzyć sytuacje, w których możesz pracować z radością bez usuwania nieśledzonych plików z innych projektów.
Ponadto, jeśli chcesz usunąć nieśledzone pliki z innych projektów, szybsze (i mniej podatne na błędy) będzie zrzucenie niechcianego katalogu niż usunięcie niechcianych plików poprzez wybranie każdego z nich.
Nazwy oddziałów mogą zawierać znaki „/”
Możesz więc nazwać swoje oddziały jakoś
project1/master
project1/featureABC
project2/master
project2/featureXYZ