2010-02-12 15 views
5

Ho un repository su cui lavoro. C'è una cartella in cui ho messo tutto ciò che voglio per open source, quindi è separato dalle parti private. C'è un modo per ottenere automaticamente git per spingere qualsiasi cosa venga trasferito su quella cartella in un repository github senza che io debba ricordarmi di spingere i file appena cambiati lassù ogni volta? Voglio spingere l'intero repository in un'altra posizione github.Auto-push cambia in una cartella in un repository gitub su github?

risposta

8

Se si dispone di un singolo repository in cui le parti sono destinate a essere pubbliche e le parti devono essere private, è necessario modificare fondamentalmente qualcosa nella configurazione del repository. git tiene traccia dei repository completi, quindi puoi rendere un repository pubblico o privato, ma non in parte questo e in parte questo.

Se si dispone di un repository con i file "pubblici" e un repository con i file "privati", è possibile aggiungere un hook git al repository "pubblico" per spingere automaticamente i commit e mantenere semplicemente il repository privato privato .

Tuttavia, si sta scrivendo di avere un unico repository che contiene sia i file "pubblico" e "privato", quindi è necessario dividere che in qualcosa di "pubblico" e qualcosa "privata, in qualche modo.

È hanno un numero di opzioni per risolvere queste situazioni:.

  1. Spalato la cartella "pubblica" in un proprio repository che si spingerà a github Questo riscrivere la storia della cartella "pubblico" un po '. Descriverò più dettagliatamente in seguito.

  2. Creare un ramo che riguarda solo la cartella "pubblica", e pubblicare solo tale ramo. Questo è rischioso nel senso "spingere accidentalmente, cioè pubblicare, cose private", e assolutamente impossibile o almeno abbastanza difficile da fare se si dispone di qualsiasi commit che tocchi sia file "pubblici" che "privati", quindi vorrei sconsiglia questa opzione e non ne scriverà più.

Per scissione la cartella "pubblica" in un proprio repository, creare un nuovo ramo "pubblico" il tuo ramo "combinata", e utilizzare git filter-branch su di esso per rendere la nuova filiale "pubblico" contengono solo roba dalla cartella "pubblica". La sezione "Esempi" mostra solo l'esempio right --subdirectory-filter). Quindi avrai sia il tuo vecchio ramo "combinato" sia con la cartella "pubblica" e le cose private in esso, sia il nuovo ramo "pubblico" con solo la cartella "pubblica".

Attenzione, ad es. i messaggi di commit nel nuovo ramo "pubblico" potrebbero ancora contenere informazioni "private". Pertanto, dovresti esaminare tutti i messaggi di commit, scansionarli per ottenere informazioni private e, possibilmente, ridurne le informazioni private, ad es. con git rebase -i.

Aggiornamento: [probabilmente non è necessaria la successiva pressione di solo il ramo "pubblico" e nient'altro probabilmente non trasferire qualsiasi altra informazione, quindi questo repo di pulizia.] Se hai bisogno di fare qualsiasi redazioni, ti consigliamo di rimuovere i vecchi revival non revocati dal repository utilizzando git gc (probabilmente con le opzioni --prune=0 e --aggressive - ma non riesco a trovare la risposta SO con maggiori informazioni a riguardo).

Ora la tua filiale "pubblica" è pronta per la pubblicazione. Per assicurarsi che contenga solo le informazioni "pubbliche", puoi spingerlo in un nuovo repository locale vuoto, esaminare il contenuto di questo per verificare che tutti i ref non abbiano informazioni private. Dopo che sei soddisfatto, puoi spingere il ramo "pubblico" in un nuovo repository vuoto su github. Il repository su github conterrà quindi SOLO il ramo "pubblico", che probabilmente dovresti chiamare "master" sul repository github.

Il repository locale con il ramo "combinato" contiene ancora informazioni pubbliche e private direttamente e non ha alcuna connessione con il nuovo repo github "pubblico".

Ora è poteva riscrivere il "combinato" la storia del ramo di contenere solo i bit non pubblici, ma che avrebbe sacrificare tutte le connessioni tra lo stato dei file di "pubblico" e "privato" durante tutta la storia, in modo da build ripetibili di vecchie cose diventerebbero quasi impossibili. Pertanto, suggerisco di lasciare da solo la cronologia del ramo "combinato" e di rimuovere la cartella "pubblica" da esso in un nuovo commit.

Se l'integrazione tra i file privati ​​e pubblici è molto stretta e dipende dalla versione, è possibile utilizzare git submodule per aggiungere una versione specifica del repository "pubblico" da github al repository privato. Una nuova cartella di sottomodulo chiamata proprio come la precedente cartella "pubblica" ridurrà al minimo le modifiche alle tue cose private, poiché tutti i file "pubblici" saranno nel loro vecchio percorso. Nota che la cartella del sottomodulo non si aggiornerà automaticamente quando qualcosa è stato inserito nel github. È possibile aggirare il problema aggiungendo un hook git alla cartella del sottomodulo locale che aggiornerebbe le informazioni sul sottomodulo nel repository "combinato".

Se l'integrazione tra i file privati ​​e pubblici è più allentata, puoi anche trattare i file pubblici come qualsiasi progetto esterno di terze parti e integrarlo nelle tue cose private nel modo in cui chiunque altro lo integrerebbe, cioè come qualsiasi software esterno da cui dipende il tuo software "privato".

+0

Sì, la stretta integrazione tra la roba pubblica e privata è il motivo per cui ho voluto tenerli in un unico repo. Le cose pubbliche vengono per lo più cambiate quando lavoro sulle cose private che lo usano, quindi non voglio tirare. Inoltre, voglio essere in grado di taggare lo stato del repository privato e includere la versione corrente delle cose pubbliche. – uliwitness

+0

I sottomoduli Git registrano lo SHA dei commit del sottomodulo. Se tagga il repository privato, quel tag includerà tutti i sottomoduli "commit SHA. Quindi puoi ottenere l'accoppiamento stretto desiderato. – ndim

0

Utilizzare un githook per confermare il commit.

+0

Non spingerebbe l'intero repository? Come posso estrarre quella cartella e il suo contenuto da lì? – uliwitness

+0

sottomodare la cartella, posthook the push – databyte