2008-09-29 9 views
37

Ich benutze Tortoise SVN normalerweise, aber ich habe in Mercurial nachgesehen, da es ein verteiltes Revisionskontrollsystem ist.Kann ich nur Teile meines Codes mit SVN oder Mercurial committen?

Was ich in beiden Systemen suche, ist ein Werkzeug, das ich nur Teile einer Datei auswählen und sie committen kann. Wenn ich das jetzt tun möchte, muss ich in eine temporäre Version der Datei kopieren und nur die Änderungen beibehalten, die ich in der aktuellen Version festschreiben möchte, und dann die temporäre Version nach dem Festschreiben wieder in die aktuelle Version kopieren. Es ist nur so ein Ärger und das Programm sollte das für mich erledigen können.

Ich habe gehört, Git unterstützt dies, lassen Sie mich bitte wissen, ob das korrekt ist.

+1

Es sollte ziemlich einfach sein, ein solches Tool für SVN zu entwickeln. Ich frage mich, warum das noch niemand gemacht hat. –

+0

@PavelRadzivilovsky Patches willkommen. Ich meine, dass Sie einen Patch schreiben und an die dev @ Mailingliste senden können. – bahrep

+0

Es gibt nun ein integriertes Commit-Dienstprogramm für diesen Zweck, das mit Mercurial mitgeliefert wird. Siehe meine Antwort unten. – Oly

Antwort

38

Mercurial kann dies mit der record Erweiterung tun.

Es wird Sie für jede Datei und jedes diff-Hunk fragen. Zum Beispiel:

% hg record 
diff --git a/prelim.tex b/prelim.tex 
2 hunks, 4 lines changed 
examine changes to 'prelim.tex'? [Ynsfdaq?] 
@@ -12,7 +12,7 @@ 
\setmonofont[Scale=0.88]{Consolas} 
% missing from xunicode.sty 
\DeclareUTFcomposite[\UTFencname]{x00ED}{\'}{\i} 
-\else 
+\else foo 
\usepackage[pdftex]{graphicx} 
\fi 

record this change to 'prelim.tex'? [Ynsfdaq?] 
@@ -1281,3 +1281,5 @@ 
%% Local variables: 
%% mode: latex 
%% End: 
+ 
+foo 
\ No newline at end of file 
record this change to 'prelim.tex'? [Ynsfdaq?] n 
Waiting for Emacs... 

Nach dem Commit, wird die verbleibende diff zurückgelassen:

% hg di 
diff --git a/prelim.tex b/prelim.tex 
--- a/prelim.tex 
+++ b/prelim.tex 
@@ -1281,3 +1281,5 @@ 
%% Local variables: 
%% mode: latex 
%% End: 
+ 
+foo 
\ No newline at end of file 

Alternativ können Sie es einfacher finden MQ zu verwenden (Mercurial Queues) die einzelnen Änderungen in Ihrem trennen Repository in Patches. Es gibt auch eine MQ-Variante von record (qrecord).

Update: auch versuchen, die crecord Erweiterung, die eine Flüche Schnittstelle zu großes Stück/Line-Auswahl zur Verfügung stellt.

crecord screenshot

+1

Schade, dass es kein GUI-Tool dafür gibt. Es ist wunderbar, dies mit GitX zu tun. – mxcl

+0

Amen. GitX ist der Grund, warum ich Git verwende; Wünschte, dass Murky so fähig wäre. (Leider bin ich zu sehr mit Open-Source-Projekten überlastet, um es zu beheben, obwohl ich sowohl zu GitX als auch zu Murky beigetragen habe :-) –

+2

Es gibt ein GUI-Tool dafür: Tortoiseehg unterstützt die Hunk-Auswahl. – Hauge

0

würde ich nicht arbeiten, wie dies empfehlen.

Wenn Sie Änderungen vornehmen müssen, setzen Sie A, das einchecken kann, und B, das noch nicht bereit ist. Wie können Sie sicher sein, dass nur das Einchecken von Set A Ihre Builds/Tests nicht unterbricht? Sie können einige Zeilen vermissen, Zeilen in einer anderen Datei vergessen oder eine Abhängigkeit, die A auf B hat, um den Build für andere zu brechen, nicht erkennen.

Ihre Commits sollten diskrete atomare Änderungen sein, die den Build für Sie oder andere auf Ihrem Team nicht brechen. Wenn Sie eine Datei teilweise begehen, erhöhen Sie die Wahrscheinlichkeit, dass Sie den Build für andere brechen, ohne es zu wissen, bis Sie einen unglücklichen Kollegen an Ihre Tür klopfen.

Die große Frage ist, warum fühlen Sie die Notwendigkeit, so zu arbeiten?

+0

Git ermöglicht dies durch Gruppieren benachbarter Linien zusammen. Es kann sehr praktisch sein, wenn Sie etwas einfach einchecken müssen und keine Verzweigung machen wollen. – davetron5000

+6

Normalerweise ist es, weil ich zu viel Code vor dem Festschreiben schreibe. Ich könnte zwei verschiedene Dinge in einer Datei ändern und sie mit verschiedenen Kommentaren versehen. – RobbieGee

+3

Git unterstützt (mit Git Stash - Keep-Index) nur die Änderungen zu isolieren, die Sie begehen werden, mit denen Sie Komponententests oder was auch immer auf ihnen leicht ausführen können. –

5

Ich fragte eine similar question gerade vor einer Weile, und die resultierende Antwort der Verwendung der hgshelve extension war genau das, was ich suchte.

Bevor Sie ein Commit durchführen, können Sie Änderungen aus verschiedenen Dateien (oder Änderungen an Änderungen in einer Datei) auf dem "Shelf" ablegen und dann die gewünschten Dinge festlegen. Dann können Sie die Änderungen, die Sie nicht vorgenommen haben, nicht speichern und weiterarbeiten.

Ich habe es in den letzten Tagen verwendet und mag es sehr. Sehr einfach zu visualisieren und zu verwenden.

12

Ja, Git ermöglicht Ihnen dies zu tun. Der Befehl git add verfügt über eine -p (oder --patch) Option, mit der Sie Ihre Änderungen Hunk-für-Hunk überprüfen können, wählen Sie die Bühne (Sie können auch die Hunks verfeinern oder die Patches an Ort und Stelle bearbeiten).Sie können auch den interaktiven Modus verwenden, um git-add (git add -i) hinzuzufügen und die Option "p" zu verwenden.

Hier ist eine screencast on interactive adding, die auch die Patch-Funktion von git add demonstriert.

+1

Beachten Sie auch, dass 'git gui' eine grafische Möglichkeit bietet, dies zu tun. –

7

Schauen Sie sich TortoiseHG an, die eine Hunk-Auswahl treffen wird und Sie verschiedene Änderungen an einer Datei vornehmen können, wie bei verschiedenen Commits.

Sie können sogar alle Änderungen an einigen Dateien zusammen mit Teiländerungen an anderen Dateien in einem Commit festschreiben.

http://tortoisehg.bitbucket.io/

+0

die GUI ist Windows nur – user7610

+1

@ user7610 nein, unterstützt Linux auch –

+0

die Nautilus-Erweiterung und die CLI ja, aber einige GUI-Tools in TortoiseHg sind für Windows – user7610

1

Mercurial bietet nun eine Option --interactive (oder -i) an den commit Befehl, die diese Funktionalität direkt aus der Box ermöglicht.

Dies funktioniert direkt von der Kommandozeile aus, also ist es perfekt, wenn Sie ein Kommandozeilen-Enthusiast sind!

Lauf

> hg commit -i 

beginnt eine interaktive Sitzung, die Prüfung ermöglicht, die Bearbeitung und Aufzeichnung einzelner Änderungen ein Commit zu erstellen.

Dies verhält sich sehr ähnlich wie die --patch und --interactive Optionen für die git add und git commit Befehle.

+0

Dies ist die beste Antwort. Keine Notwendigkeit der Verlängerung usw. Danke für die Antwort. –