Qual è la migliore pratica per mettere più progetti in un repository git? [chiuso]


188

Per qualche ragione, ho solo un repository da usare.
Ma ho più progetti tra cui javaprogetti php scriptse Androidprogetti di app.

Ora il mio problema è che devo metterli in diverse sottocartelle all'interno del repository
. Uso IDE diversi. Sai, ogni IDE può avere uno spazio di lavoro autonomo.

Chi può dirmi una best practice per risolvere il problema?



2
Non sei solo. Ho un caso simile con i miei repository che utilizzo a fini di apprendimento (esempio: github.com/hopbit/java-sandbox ). Non voglio creare un nuovo repository per provare esempi per ogni nuovo libro / tutorial che inizio a leggere ...
Łukasz Siwiński

Uno dei motivi per cui vorresti farlo è se hai un progetto che è il codice prodotto che distribuisci in ambienti di runtime come test o produzione. Il secondo progetto è un'applicazione che verifica (ad esempio BDD) il primo progetto. Esiste una relazione stretta tra questi due progetti e ora è possibile mantenere / consultare l'insieme utilizzando un URL repository.
Lance Kind,

Riepilogo come sotto "Git non ha idea se si tratti di parti dello stesso progetto o di progetti diversi"
ahmednabil88

Risposte:


198

Mentre la maggior parte delle persone ti dirà di usare più repository, credo che valga la pena menzionare che ci sono altre soluzioni.

Soluzione 1

Un singolo repository può contenere più rami indipendenti , chiamati rami orfani . I rami orfani sono completamente separati l'uno dall'altro; non condividono storie.

git checkout --orphan BRANCHNAME

Ciò crea un nuovo ramo, non correlato al ramo corrente. Ogni progetto dovrebbe trovarsi nel suo ramo orfano.

Ora, per qualsiasi motivo, git ha bisogno di un po 'di pulizia dopo un checkout orfano.

rm .git/index
rm -r *

Assicurarsi che tutto sia impegnato prima di eliminare

Una volta che il ramo orfano è pulito, puoi usarlo normalmente.

Soluzione 2

Evita tutta la seccatura dei rami orfani. Crea due repository indipendenti e trasferiscili sullo stesso telecomando. Basta usare nomi di rami diversi per ciascun repository.

# repo 1
git push origin master:master-1

# repo 2
git push origin master:master-2

Grazie mille, dovrebbe essere in grado di risolvere il mio problema. In realtà, le due soluzioni utilizzano le filiali per contenere progetti diversi.
Pietroso

6
Non sono sicuro di aver capito la soluzione 2. Stai dicendo che esegui il commit di tutti i file .git in un repository master git? Qual è la differenza tra l'utilizzo di più rami orfani rispetto all'utilizzo di più rami?
Nate

14
@Nate Quello che sta dicendo è questo: crea due repository locali separati , quindi trasferiscili entrambi nello stesso repository remoto su GitHub.
The Guy with The Hat,

1
Grazie @TheGuywithTheElfHat. Ora che lo guardo di nuovo (9 mesi dopo) mi sembra chiaro. La soluzione 2 sta ancora creando rami orfani ma posso vedere come questo metodo è più facile da gestire.
Nate,

21
La soluzione 2 richiede ulteriori spiegazioni
eC Droid,

19

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

Diagramma dei repository uniti

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 thesisdirectory 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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.