Soluzione 3
Questo serve per usare una singola directory per più progetti. Uso questa tecnica per alcuni progetti strettamente correlati in cui spesso ho bisogno di trascinare i cambiamenti da un progetto all'altro. È simile all'idea dei rami orfani ma i rami non hanno bisogno di essere orfani. Basta avviare tutti i progetti dallo stesso stato di directory vuoto.
Avvia tutti i progetti da una directory vuota impegnata
Non aspettarti meraviglie da questa soluzione. A mio avviso, avrai sempre fastidi con i file non tracciati. Git non ha davvero idea di cosa fare con loro e quindi se ci sono file intermedi generati da un compilatore e ignorati dal tuo file .gitignore, è probabile che rimarranno sospesi qualche volta se provi a scambiare rapidamente tra - per esempio - il tuo progetto software e un progetto di tesi di dottorato.
Comunque ecco il piano. Inizia come dovresti avviare qualsiasi progetto git, eseguendo il commit del repository vuoto, quindi avvia tutti i tuoi progetti dallo stesso stato di directory vuota. In questo modo sei sicuro che i due lotti di file siano abbastanza indipendenti. Inoltre, dai ai tuoi rami un nome proprio e non usare pigramente "master". I tuoi progetti devono essere separati, quindi dai loro i nomi appropriati.
Git commette (e quindi tag e rami) in sostanza memorizza lo stato di una directory e delle sue sottodirectory e Git non ha idea se si tratti di parti dello stesso progetto o di progetti diversi, quindi in realtà non c'è alcun problema per archiviare git progetti diversi nello stesso repository. Il problema è quindi per te di cancellare i file non tracciati da un progetto quando ne usi un altro o di separare i progetti in un secondo momento.
Crea un repository vuoto
cd some_empty_directory
git init
touch .gitignore
git add .gitignore
git commit -m empty
git tag EMPTY
Inizia i tuoi progetti da vuoto.
Lavora su un progetto.
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"
Inizia un altro progetto
quando vuoi.
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"
Passa avanti e indietro
Vai avanti e indietro tra i progetti ogni volta che vuoi. Questo esempio risale al progetto del software di scacchi.
git checkout software
echo "while not end_of_game do make_move()" >> chess.prog
git add chess.prog
git commit -m "improved chess program"
I file non tracciati sono fastidiosi
Sarai comunque infastidito da file non tracciati durante lo scambio tra progetti / rami.
touch untracked_software_file.prog
git checkout thesis
ls
philosophy_doctorate.txt untracked_software_file.prog
Non è un problema insormontabile
Un po 'per definizione, git non sa davvero cosa fare con i file non tracciati e sta a te occupartene. È possibile impedire che i file non tracciati vengano trasportati da un ramo all'altro come segue.
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
Assicurandoci che la directory fosse vuota prima di dare un'occhiata al nostro nuovo progetto, ci siamo assicurati che non ci fossero file sospesi non tracciati da un altro progetto.
Una raffinatezza
$ GIT_AUTHOR_DATE='2001-01-01:T01:01:01' GIT_COMMITTER_DATE='2001-01-01T01:01:01' git commit -m empty
Se vengono specificate le stesse date ogni volta che si esegue il commit di un repository vuoto, i commit di repository vuoti creati in modo indipendente possono avere lo stesso codice SHA1. Ciò consente di creare due repository in modo indipendente e quindi unirli insieme in un singolo albero con una radice comune in un repository in un secondo momento.
Esempio
# 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
Risultato
Utilizzare le sottodirectory per progetto?
Può anche essere utile se i tuoi progetti vengono conservati in sottodirectory ove possibile, ad esempio invece di disporre di file
chess.prog
philosophy_doctorate.txt
avere
chess/chess.prog
thesis/philosophy_doctorate.txt
In questo caso il tuo file software non tracciato sarà chess/untracked_software_file.prog
. Quando lavori nella thesis
directory non dovresti essere disturbato da file di programma di scacchi non tracciati e potresti trovare occasioni in cui puoi lavorare felicemente senza cancellare file non tracciati da altri progetti.
Inoltre, se si desidera rimuovere file non tracciati da altri progetti, sarà più rapido (e meno soggetto a errori) scaricare una directory indesiderata piuttosto che rimuovere i file indesiderati selezionando ciascuno di essi.
I nomi delle filiali possono includere caratteri "/"
Quindi potresti voler dare un nome ai tuoi rami in qualche modo
project1/master
project1/featureABC
project2/master
project2/featureXYZ