it-swarm.it

Impegni parziali con Subversion

Dato il caso ho fatto due modifiche indipendenti in uno file: es. aggiunto un nuovo metodo e cambiato un altro metodo.

Spesso non voglio commettere entrambe le modifiche come one commit, ma come two commit indipendenti.

Su un repository git userei la Interactive Mode di git-add (1) per dividere il hunk in quelli più piccoli:

 git add --patch

Qual è il modo più semplice per farlo con Subversion? (Forse anche usando un plug-in Eclipse)

Aggiornare:
In The Thing About Git , Ryan lo chiama: "The Tangled Working Copy Problem"

96

Con git-svn è possibile creare un repository GIT locale del repository SVN remoto, utilizzarlo con l'intera serie di funzionalità GIT (compresi i commit parziali) e quindi Spingerlo tutto nel repository SVN.

git-svn (1)

32
jkramer

Tortoise SVN 1.8 ora supporta questo con la sua funzione "Ripristina dopo commit". Ciò consente di apportare modifiche a un file, con tutte le modifiche annullate dopo il commit

Per la documentazione:

Per impegnare solo le parti del file relative a un problema specifico:

  1. nella finestra di dialogo di commit, fare clic con il tasto destro del mouse sul file, selezionare "ripristina dopo il commit"
  2. modifica il file in es. TortoiseMerge: annulla le modifiche che non vuoi ancora commettere
  3. salva il file
  4. impegnare il file
58
Casebash

L'ho fatto usando TortoiseSVN .

L'utilità di fusione incorporata ti consente di mostrare una differenza tra la versione del repository e la tua copia di lavoro.

Utilizzare la funzione create backup dell'utilità diff

  1. Vai a salvare il tuo file come se dovessi impegnare tutte le tue modifiche.
  2. Nella finestra di commit, fai doppio clic sul file per mostrare una diff.
  3. Nelle impostazioni di diff, fare clic sull'opzione per backup del file originale
  4. Fai clic con il pulsante destro del mouse sulle modifiche che non desideri e usa select usa un altro blocco di testo.
  5. Salva il diff esattamente una volta. Il backup verrà sovrascritto ogni volta che si salva. Questo è il motivo per cui vuoi salvare solo una volta.
  6. Impegna il cambiamento.
  7. Sovrascrivi l'originale con il file .bak creato (che avrà tutte le tue modifiche originali).
  8. Configura il tuo file.

Ora dovresti eseguire tutte le modifiche, utilizzando due commit separati.

42
Spike

Prova a utilizzare svn diff > out.patch quindi copia il file out.patch su out.patch.add e out.patch.modify 

Solo quando si ha un file di patch funzionante ripristina il file originale usando svn revert out.c.

Modifica i file patch a mano in modo che contengano solo hunks per aggiungere o modificare. Applicali al file originale usando il comando patch, verifica se l'aggiunta ha funzionato, quindi svn commit l'aggiunta.

Ripeti risciacquo per la patch out.patch.modify.

Se le modifiche sono separate nel file come indicato dalla domanda iniziale: aggiunto un nuovo metodo, modificato un metodo esistente, funzionerà

Questa è una soluzione molto noiosa, anche se non sono convinto che dovresti avere una ragione per separare i tuoi impegni.

Potresti aver estratto più copie di lavoro della stessa fonte per applicare il tuo lavoro contro:

svn co http://location/repository methodAdd

svn co http://location/repository methodModify

Assicurati di svn up e prova per assicurarti che tutto vada bene.

25
Chris

Questo è possibile usando TortoiseSvn (Windows) dalla v1.8.

4.4.1. Il dialogo di commit

Se la tua copia di lavoro è aggiornata e non ci sono conflitti, sei pronto a confermare le tue modifiche. Seleziona qualsiasi file e/o cartelle che vuoi impegnare, quindi TortoiseSVN → Conferma ....

<Snip>

4.4.3. Impegna solo parti di file

A volte vuoi solo commettere parti delle modifiche apportate a un file. Una tale situazione di solito succede quando stai lavorando su qualcosa ma poi ha bisogno di una soluzione urgente essere commesso, e quella correzione sembra essere nello stesso file che sei lavorandoci. 

fare clic con il tasto destro sul file e utilizzare il menu di scelta rapida → Ripristina dopo commit . Questo creerà una copia del file così com'è. Quindi puoi modificare il file, ad es. in TortoiseMerge e annulla tutte le modifiche che non vuoi commettere. Dopo aver salvato queste modifiche, puoi salvare il file. 

Al termine del commit, la copia del file viene ripristinata automaticamente, e tu hai il file con tutte le tue modifiche che non sono stati restituiti.

Su Linux, darei http://webstaff.itn.liu.se/~karlu20/div/blog/2013-05-31_SVNPartialCommit.php a provare. Non l'ho provato da solo, però.

10
parvus

Ho usato per fare questo:

  • Nel mio editor (io uso vim), modifica il file in modo che appaia solo una delle modifiche
  • Salva il file (ma non chiudere l'editor)
  • Configura il file modificato in svn
  • Premi "annulla" nell'editor abbastanza volte per riapparire la seconda serie di modifiche
  • Salva di nuovo il file
  • Configura la seconda serie di modifiche.

Questo è un approccio semplicistico che presuppone che un insieme di modifiche sia ragionevolmente facile da annullare. Per situazioni più complesse, rinuncerei e impegnerei entrambi i cambiamenti senza preoccuparmi di ciò.

Ora che uso git, questo è qualcosa che spero di non dover mai più fare!

8
Greg Hewgill

Uso un repo locale di darcs, o semplicemente unisco le modifiche gradualmente. Con la fusione (opendiff apre FileMerge, un programma di fusione che viene fornito con Xcode, sostituirlo con il tuo strumento di fusione preferito):

cp file file.new
svn revert file
opendiff file.new file -merge file

unire le modifiche correlate, salvare l'unione, uscire dal programma di fusione

svn ci -m 'first hunk' file
mv file.new file
svn ci -m 'second hunk' file

se più di un hunk non correlato nel file, risciacqua e ripeti (ma perché dovresti aspettare così tanto prima di impegnarti ?!)

Inoltre, se conosci git, puoi usare git-svn per mantenere un repository git locale e sincronizzare i tuoi commit con un server master svn; Funziona alla grande nella mia limitata esperienza.

5
Aeon

Prova VisualSVN per Visual Studio . La ultima versione 6.1 introduce la funzione QuickCommit. È possibile eseguire il commit parziale delle modifiche selezionate in un file utilizzando i nuovi comandi del menu di scelta rapida Commit this Block e Commit Selection nell'editor di Visual Studio.

 enter image description here

3
bahrep
  1. Apri tutti i file che vuoi dividere in editor di scelta
  2. Usando un set di strumenti diverso (su Win, usa il suggerimento di Spike (la vecchia versione)) di nuovo fuori dal secondo set
  3. Commettere
  4. torna al tuo editor di scelta e salva tutti i file

È un po 'più rischioso del suggerimento pieno di Spike, ma può essere più facile da fare. Assicurati anche di provarlo su qualcos'altro prima, dato che alcuni editor si rifiuteranno di salvare su un file che è stato modificato da sotto a loro a meno che tu non ricarichi quel file (perdendo tutte le tue modifiche)

2
BCS

Penso che un'opzione più semplice rispetto alla generazione di file diff, al ripristino, ecc, sia quella di avere due copie del repository verificate, e utilizzare uno strumento di visualizzazione visuale come DeltaWalker per copiare gli hunk da uno all'altro.

La prima copia sarebbe quella che effettivamente funziona, e la seconda sarebbe solo per questo scopo. Dopo aver apportato una tonnellata di modifiche al primo, puoi copiare una sezione sul secondo, eseguirne il commit, copiare un'altra sezione, eseguirne il commit, ecc.

0
Ian Dunn
  1. Copia tutti i file modificati interessati alle copie di backup.
  2. Crea una patch dello stato di lavoro usando svn diff.
  3. Ripristina i file usando svn revert.
  4. Riapplica le parti della patch che vuoi impegnare, usando lo strumento patch, o con la modifica manuale, o qualsiasi altra cosa.
  5. Esegui diff in seguito per confrontare la tua copia di lavoro con il tuo back-up per essere sicuro di aver applicato correttamente le patch.
  6. Costruisci e prova.
  7. Commettere.
  8. Copia le copie di back-up al check-out del tuo repository.
  9. Ripeti alle 2. (non alle 1.!) Fino a quando non hai finito.
0
michaeljt