2009-03-11 5 views
7

Desidero avere i file che inseguo nel mio repository git locale che non vengono registrati nel repository svn centrale quando eseguo git-svn dcommit. Ho spesso modifiche solo locali a lunga vita ai file tracciati nel repository. A volte è per il debug del codice. Ho anche file IDE di progetto che vorrei tracciare. Con il semplice vecchio svn, inserirò questi file in un elenco delle modifiche denominato "XYZ: DO NOT CHECK IN" e quindi gestirò manualmente il problema solo quando effettivamente avrò delle modifiche che devo eseguire.Come si rintracciano cambiamenti/cambi di solo locale con git-svn?

Idealmente, vorrei verificare le mie modifiche nel mio ramo principale ma impostare qualcosa che impedisca a quelle specifiche modifiche di propagarsi al repository SVN. Userei git e git-svn nel modo convenzionale, ma alcuni commit non vengono mai messi in discussione. Ovviamente, posso farlo manualmente ogni volta che faccio un commit, ma questo è un dolore.

Ho preso in considerazione e scartato un paio di cose. Non voglio escludere questi file, perché a volte ho bisogno di apportare modifiche che vengono respinte. Inoltre, mi piacerebbe che questi file appaiano in tutti i rami solo locali che creo, come nel caso dei file IDE. Tuttavia, non posso isolare queste modifiche in un singolo ramo perché le voglio in ogni ramo, come con i file IDE. Sembra che qualcosa come colpa o stgit possano fare ciò che voglio, ma non è ovvio, poiché aggiungono il loro livello di complessità al git, che sto ancora imparando.

risposta

0

Si potrebbe voler prendere in considerazione l'utilizzo della scorta per quello.

git-stash - Stash the changes in a dirty working directory away 

Potrebbe essere sottodimensionato per quello che stai descrivendo però.

+0

lo stash può memorizzare solo modifiche non accettate nell'albero. Alla fine l'OP vuole controllare le modifiche ai file, ma impedire che vengano commessi al repository SVN. – cmcginty

+0

In realtà, alcune delle modifiche che potrei non voler mai commettere. Forse è una cattiva pratica, ma è stato conveniente. – normal

2

Sono un po 'nuovo da git, ma consiglio di utilizzare un master separato e un ramo di lavoro nel repository git locale.

Aggiungere i file "non SVN" solo al ramo di lavoro. Generalmente fai tutte le modifiche al codice nel ramo di lavoro. Quando i file "non-SVN" cambiano, aggiungi quelli che usano un commit univoco e imposta un prefisso del messaggio di commit (es. "Local:" o "private:"). Quando si è pronti a impegnarsi per SVN poi:

  1. Mostra un registro di commit per aggiungere al SVN:

    git co working 
    git cherry master 
    
  2. Aggiungi tutti i commit a monte al ramo principale, ignorando "privato" impegna. Ripetere questo passaggio fino a quando tutti i commit upstream sono in master.

    git co master 
    git cherry-pick <SHA1> 
    
  3. spinta impegna a SVN repo:

    git svn rebase 
    git svn dcommit 
    
+0

Grazie per il suggerimento. Potrei dover ricorrere a quello, ma l'inconveniente è che dovrò fare del lavoro extra ogni volta. – normal

0

ho fatto qualche ricerca e si avvicinò con un una possibilità che potrebbe farlo: 2 repository git che punta alla stessa directory. La variabile di ambiente GIT_DIR memorizza il nome della directory del repository locale. Se non impostato, git è impostato su .git, ma potrebbe essere qualsiasi cosa.

Quello che potrei fare è avere un repository in .git che si collega al mio repository Subversion. Questo è il caso comune. Quindi potrei avere un altro repository in .localgit. Ogni repository dovrebbe essere configurato per ignorare i file gestiti dall'altro. È facile con! per negare i modelli.

Quando apporto una modifica ai file locali che desidero effettuare il check-in, cambio la mia variabile d'ambiente GIT_DIR o uso l'argomento della riga di comando --git-dir. Se ho il mio esclude/ignora impostato correttamente, non dovrò preoccuparmi di collisioni. Ovviamente c'è un sovraccarico per tenerlo aggiornato, ma posso scrivere uno script wrapper che aggiunge un file all'esclusione di un repository quando il file viene aggiunto all'altro. Inoltre, l'overhead si verifica solo una volta per file anziché su ogni commit come con il suggerimento per più diramazioni.

Se volevo renderlo più semplice, potrei usare la convenzione di denominazione, ma posso anche farlo su ogni singolo file, poiché il numero di file solo locali è quasi certo di essere nelle singole cifre (altrimenti io sto facendo qualcosa di sbagliato).

Il lato negativo che vedo con questo approccio è che non sarei in grado di ramificare e memorizzare e ripristinare i file solo locali allo stesso modo dei file nel repository SVN. Le mie modifiche a quelle sono probabilmente asincrone rispetto alle mie principali modifiche, quindi non penso che sarebbe un problema significativo nella pratica. Potrei anche scrivere wrapper per quelle funzioni che erano a conoscenza di più repository. Inoltre, dovrò essere più esplicito quando gestisco file locali, ma praticamente qualsiasi situazione dovrebbe occuparsene, a meno di più repository incorporati in git stesso.

2

La mia attuale soluzione al problema consiste nell'utilizzare stacked git (stg) e mantenere queste modifiche locali come patch separate. Quando ho bisogno di dcommit in Subversion, faccio un

stg pop # naming the patches that should not be commited 
stg commit # the rest of the patches to commit 
git svn dcommit 
stg push # naming the patches that are used locally 

La cosa bella circa il mantenimento di queste come patch separate è che posso facilmente avere patch che modificano mio test di unità per testare diversi backend di database. Così normalmente io prova contro Oracle, ma se voglio controllare contro il Derby, faccio

stg push local-mods-derby 
ant tests 
stg pop 

o se voglio confrontare con PostgreSQL, corro

stg push local-mods-test-postgresql 
ant tests 
stg pop 

Qui, "locale-mods- derby "e" local-mods-test-postgresql "sono i nomi delle patch.

Quindi mantenere distinte aree di lavoro è molto semplice con stg.

1

Hai mai pensato di non lavorare nel ramo principale?

Se si mantengono le modifiche in un ramo git locale, è possibile unire periodicamente o selezionare semplicemente le modifiche desiderate nel ramo di rilevamento svn. Passa al ramo di monitoraggio, esegui il tuo dcommit. Quindi torna al tuo ramo locale e rebase.

Se si desidera modificare i vari rami, basarli tutti sullo stesso punto di diramazione. Mantieni quel ramo come master + cambia tramite rebasing. Quindi per tutti gli altri rami, basta ribasare quel ramo di base.