Was ist der einfachste Weg, um eine einzelne Datei zu begehen und zu drücken, während andere Modifikationen allein zu lassen?

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

Frage

Ich bin relativ neu in Mercurial und mein Team versucht es jetzt als Ersatz für Subversion aus.

Wie kann ich begehen und eine einzelne Datei drücken, um ein anderes Repository, während andere Änderungen in meinem Arbeitsverzeichnis verlassen uncommitted (oder zumindest nicht in dem anderen Repository geschoben)?

Dies geschieht für uns mit Datenbank-Migrationen. Wir wollen die Migration auf Quellcodeverwaltung verpflichten, so ein DBA kann es anzuzeigen und zu bearbeiten, während wir uns auf den Code-Änderungen arbeiten mit dieser Datenbank-Migration zu gehen. Die Änderungen sind noch nicht bereit, wir gehen also nicht alle von ihnen heraus schieben wollen.

In Subversion, ich würde einfach tun:

svn add my_migration.sql  
# commit only the migration, but not the other files I'm working on
svn commit -m "migration notes" my_mygration.sql

und weiter vor Ort zu arbeiten.

Das funktioniert nicht mit Mercurial als wenn ich es aus mit dem anderen Repository bin drängen, wenn es Änderungen daran, dass ich nicht nach unten gezogen haben, sie will, dass ich sie nach unten ziehen, verschmelzen sie, und verpflichten dass in dem Repository verschmelzen. Commits nach einer Zusammenführung nicht erlaubt Sie Dateien weglassen, damit es Sie zwingt, alles in Ihrem lokalen Repository zu begehen.

Die einfachste Sache, die ich herausfinden kann, ist die Datei in meinem lokalen Repository zu begehen, mein lokales Repository klonen, holt alle neue Änderungen aus dem aktuellen Repository, kombinierte sie und verpflichtet, dass merge, und sie meine Änderungen schieben.

hg add my_migration.sql 
hg commit -m "migration notes" my_migration.sql 
cd ..
hg clone project project-clone
cd project-clone
hg fetch http://hg/project
hg push  http://hg/project

Dies funktioniert, aber es fühlt sich an wie ich etwas fehlt bin einfacher, eine Möglichkeit, Mercurial zu sagen, die Dateien bereits in meinem Arbeitsverzeichnis zu ignorieren, nur die Zusammenführung zu tun und entlang der Dateien senden. Ich vermute, Mercurial Warteschlangen können dies tun, aber ich weiß nicht voll grok mq noch.

War es hilfreich?

Lösung

Es gibt eine Mercurial-Funktion, die ad acta legen und unshelve Befehle implementiert, die eine interaktive Art und Weise gibt Änderungen gibt bis zu einem späteren Zeitpunkt speichern weg: Shelve .

Dann können Sie hg shelve und hg unshelve zum vorübergehenden Speichern von Änderungen entfernt. Damit können Sie auf der „Patch-Stück“ Ebene arbeiten, um die Einzelteile zu wählen, und wählen ad acta entfernt. Es schien nicht eine Datei ad acta hatte aufgelistet für das Hinzufügen von nur Dateien bereits im Repo mit Änderungen.

Es ist mit Mercurial als „Erweiterung“ enthalten, das nur bedeutet, dass Sie es in Ihrer hg Config-Datei ermöglichen haben.


Hinweise für wirklich alte Versionen von Mercurial (vor shelve enthalten war - das ist nicht mehr erforderlich):

Ich habe keine großen Installationsanweisungen mit einigen googeln, hier so ist die kombinierte Sachen, die ich verwendet, um es arbeiten:

Erhalten Sie es mit:

hg clone http://freehg.org/u/tksoh/hgshelve/ hgshelve

Die einzige Datei (zur Zeit) im Projekt ist die hgshelve.py Datei.

Ändern Sie bitte Ihre ~ / .hgrc die shelve Erweiterung hinzuzufügen, indem er auf dem Sie das Repo geklont:

[extensions] 
hgshelve=/Users/ted/Documents/workspace/hgshelve/hgshelve.py

Andere Tipps

Es ist fast 2 Jahre her, dass ich ursprünglich diese Frage gestellt. Ich würde es anders machen jetzt (wie ich in einem Kommentar über die Frage oben erwähnt). Was ich jetzt stattdessen wäre tun würde, um meine Änderungen an der eine Datei in meinem lokalen Repo zu begehen (Sie können die hg Satzerweiterung nur verwenden können, um Teile einer Datei zu begehen):

hg commit -m "commit message" filename

Dann drücken Sie einfach aus.

hg push

Wenn es ein Konflikt, da andere Änderungen an den Repo gemacht worden, dass ich zum ersten Mal zusammenführen muß, würde ich auf die Mutter Revision aktualisieren (gesehen mit „hg Eltern -r.“, Wenn Sie nicht wissen, was es ist, ), meine andere Änderungen dort begehen, damit ich zwei Köpfe haben. Dann wieder zurück auf die ursprüngliche einzelne Datei begehen und ziehen / verschmelzen die Änderungen in dieser Version. Dann drücken Sie die Änderungen mit

hg push --rev .

Push-out nur die einzelne Datei und die Zusammenführung von dieser Revision. Dann können Sie die beiden Köpfe fusionieren Sie vor Ort haben.

Auf diese Weise wird für abgelehnte große Stücke des mq Sachen und das Potenzial zu befreien und alles von der Quellcodeverwaltung verfolgt hält. Sie können „hg Streifen“ Revisionen ab auch wenn Sie später entscheiden, sie nicht wollen.

tl; dr: Meine ursprüngliche Erklärung sieht kompliziert aus, aber ich hoffe, dass es voll wird erläutert, wie eine Patch-Warteschlange verwenden. Hier ist die kurze Version:

$ hg qnew -m "migration notes" -f migration my_migration.sql
$ hg qnew -f working-code
# make some changes to your code
$ hg qrefresh # update the patch with the changes you just made
$ hg qfinish -a # turn all the applied patches into normal hg commits

Mercurial Queues machen diese Art der Sache ein Kinderspiel, und es macht komplexere Manipulation von Differenzmengen möglich. Es lohnt sich zu lernen.

In dieser Situation zunächst würden Sie wahrscheinlich speichern möchten, was in Ihrem aktuellen Verzeichnis ist, bevor die Änderungen nach unten ziehen:

# create a patch called migration containing your migration
$ hg qnew -m "migration notes" -f migration.patch my_migration.sql
$ hg qseries -v # the current state of the patch queue, A means applied
0 A migration.patch
$ hg qnew -f working-code.patch # put the rest of the code in a patch
$ hg qseries -v
0 A migration.patch
1 A working-code.patch

Lassen Sie sich nun auf dem Arbeits Code einige zusätzliche Arbeit tun. Ich werde nur explizit zu tun qseries zu halten, aber wenn Sie ein mentales Modell von Patch-Warteschlangen aufbauen, werden Sie nicht in der Liste suchen, haben zu halten.

$ hg qtop # show the patch we're currently editing
working-code.patch
$ ...hack, hack, hack...
$ hg diff # show the changes that have not been incorporated into the patch
blah, blah
$ hg qrefresh # update the patch with the changes you just made
$ hg qdiff # show the top patch's diff

Da alle Ihre Arbeit in der Patch-Queue jetzt gespeichert wird, können Sie diese Änderungen Unapply und sie wiederherstellen, nachdem Sie in den Remote-Änderungen gezogen haben. Normalerweise alle Patches Unapply, nur hg qpop -a tun. Gerade die Wirkung zu zeigen, auf der Patch-Queue ich sich weg zu einem Zeitpunkt eines Pop werden.

$ hg qpop # unapply the top patch, U means unapplied
$ hg qseries -v
0 A migration.patch
1 U working-code.patch
$ hg qtop
migration.patch
$ hg qpop
$ hg qseries -v
0 U migration.patch
1 U working-code.patch

An diesem Punkt ist es, als ob es keine Änderungen in Ihrem Verzeichnis befinden. Haben die hg fetch. Jetzt können Sie Ihre Patch-Warteschlange Änderungen zurückzudrängen auf, und sie zusammenführen, wenn es Konflikte gibt. Dies ist vom Konzept her ein wenig ähnlich der rebase git.

$ hg qpush # put the first patch back on
$ hg qseries -v
0 A migration.patch
1 U working-code.patch
$ hg qfinish -a # turn all the applied patches into normal hg commits
$ hg qseries -v
0 U working-code.patch
$ hg out
migration.patch commit info... blah, blah
$ hg push # push out your changes

An diesem Punkt haben Sie die Migration herausgedrückt wird, während die andere lokale Änderungen zu halten. Weitere Änderungen sind in einem Patch in der Warteschlange. Ich mache die meisten meiner persönlichen Entwicklung einen Patch Warteschlange mit mir besser meine Änderungen zu helfen, strukturieren. Wenn Sie wollen, loszuwerden, die Patch-Queue zu bekommen und zu einem normalen Stil zurückgehen werden Sie Ihre Änderungen exportieren müssen und wieder importieren sie in „normalen“ Mercurial.

$ hg qpush
$ hg qseries -v
0 A working-code.patch
$ hg export qtip > temp.diff
$ rm -r .hg/patches # get rid of mq from the repository entirely
$ hg import --no-commit temp.diff # apply the changes to the working directory
$ rm temp.diff

Ich bin enorm süchtig Warteschlangen ist für die Entwicklung und mq patchen es einer der schönsten Implementierungen aus. Die Fähigkeit, gleichzeitig mehrere Änderungen an Handwerk wirklich nicht verbessert, wie konzentriert und reinigen Sie Ihre Commits sind. Es dauert eine Weile, sich daran zu gewöhnen, aber es geht unglaublich gut mit einem DVCS Workflow.

Eine weitere Option, wenn Sie nicht wollen, auf Erweiterungen verlassen ist ein Klon der Upstream-Repository zu halten lokal, dass Sie nur für diese Art von Integrationsaufgaben nutzen.

In Ihrem Beispiel könnten Sie einfach ziehen / fusionieren, um die Änderung in die Integration / Upstream-Repository und schieben Sie es direkt bis zu dem Remote-Server.

Was ich in der Regel verwenden, wird verwenden, um eine einzelne Datei zu begehen:

 hg commit -m "commit message" filename

später im Fall habe ich einen Merge-Konflikt und ich bin noch nicht bereit, meine Änderungen zu übernehmen, gehen Sie folgendermaßen vor:

1) Erstellen Sie eine Patch-Datei.

hg diff > changes.patch

2) Revert alle ausstehenden unbestätigten Änderungen, nur nach dem Patch-Datei zu überprüfen.

hg revert --all
Ziehen

3), zu aktualisieren und verschmelzen zu letzter Revision

hg pull -u
hg merge
hg commit -m "local merge"

4) Nun importieren Sie einfach Ihre Patch zurück und die Änderungen erhalten.

hg import --no-commit changes.patch

Denken Sie daran, -no-commit Flagge von Auto zu verwenden, um die Änderungen kommen kann.

Da Sie am einfachsten gesagt, verwende ich oft hg commit -i (--interactive), auch wenn ganze Dateien zu begehen. Mit --interactive Sie die Datei einfach auswählen können (n) mögen Sie lieber als ihren gesamten Pfad eingeben (n) auf der Kommandozeile. Als zusätzlichen Bonus können Sie auch selektiv / Ausschluss Stücke innerhalb der Dateien.

Und dann hg push nur schieben, dass neu verpflichten erstellt.

ich weitere Informationen setzen Sie auf mit hg commit --interactive in dieser Antwort: https://stackoverflow.com/a/47931672/255961

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top