Git: fusione di filiali pubbliche e private mantenendo intatti alcuni file in entrambe le filiali

StackOverflow https://stackoverflow.com/questions/1807036

  •  05-07-2019
  •  | 
  •  

Domanda

Ho letto alcune domande git qui, ma non sono riuscito a trovare una risposta a questa:

Ho una filiale pubblica e una privata in cui desidero consentire la differenziazione di determinati file.

Questi sono file di configurazione con password e le mie personalizzazioni locali.

Voglio poter unire i rami in entrambi i modi: da privato a pubblico e viceversa, ma non voglio che questi file specifici vengano uniti automaticamente.

C'è un modo per configurare git in questo modo? Mi piacerebbe trovare una soluzione automatizzata :) - in modo che l'unione possa avvenire come al solito.


EDIT: ecco la soluzione che ha funzionato per me (Grazie a VonC per i consigli su gitattribute)

l'unica cosa inaspettata per me è stata quella "protezione da unione". inizia a funzionare solo dopo che i file sono divergenti nei due rami, non immediatamente dopo l'applicazione della seguente configurazione

.gitattributes (traccia con git se vuoi condividerlo) o .git / info / attributi:

file1      merge=keepmine
path/file2     merge=keepmine

keepmine è il gestore unione personalizzato denominato che è solo un comando do-nothing chiamato anziché il driver di unione interno sui file selezionati, impostato di seguito

Quando mi unisco dalla filiale privata a quella pubblica, di solito faccio git merge --squash private . In questo modo le modifiche private non entreranno nella cronologia git sul ramo pubblico.

.git / config:

#public repository
[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = <public repo git url> 

#private repository
#has to set up with git init and populated with the initial commit to branch mybranch
[remote "private"]
    push = +:
    url = /path/to/local/private/repo 
[merge "keepmine"]
    name = dont_merge_selected_files
    driver = echo %O %A %B 
[branch "master"]
    remote = origin
    merge = refs/heads/master 

#private branch settings
[branch "mybranch"]
    remote = private
    merge = refs/heads/mybranch

se c'è un modo per migliorare questo, commenta

È stato utile?

Soluzione

Per essere al sicuro, puoi aggiungere un attributo git (vedi qui per un esempio ) per quei file privati.

In questo modo, puoi definire uno script (un "gestore di merge") che assicurerà che il file contenente informazioni private rimanga vuoto (o con un contenuto pubblico) se unito alla filiale pubblica, mantenendo il suo contenuto locale se unito alla filiale privata.
Significa che puoi unire / rebase senza pensare a quel file.

Altri suggerimenti

Un modo per farlo è con git rebase . Mantenendo le modifiche private man mano che qualche commit si interrompe alla fine del tuo master , puoi impegnare cose pubbliche nel ramo master (o qualunque cosa tu scelga di essere nel tuo ramo di lavoro) e quindi reimpostare la filiale privata su master ogni volta che si desidera aggiornare.

Un altro modo per gestirlo è mantenere i file di configurazione del modello in Git, come frobozz.config.template . Nella tua directory di lavoro, copia frobozz.config.template nel frobozz.config (non verificato) e modifica. Assicurati di eseguire il backup anche della directory di lavoro, se hai bisogno del backup delle modifiche locali.

Questo sembra funzionare solo se vengono rilevati conflitti di unione. Unendo avanti e indietro tra i rami il file viene sovrascritto. A meno che non abbia impostato qualcosa di sbagliato. Ovviamente questo in Windows msysgit git versione 1.6.5.1.1367.

Mantenere le password sotto il controllo della versione è l'idea peggiore di sempre. È necessario CVS, non git, per lavorare con file separati. Esci come molti altri DVCS moderni che lavorano con l'intero albero, non con file separati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top