هل يمكنني الالتزام بأجزاء فقط من الكود الخاص بي باستخدام SVN أو Mercurial؟

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

سؤال

أستخدم Tortoise SVN عادةً، لكني كنت أبحث في Mercurial لأنه نظام تحكم في المراجعة الموزع.

ما أبحث عنه، في كلا النظامين، هو أداة تسمح لي باختيار أجزاء فقط من الملف وتثبيتها.إذا كنت أرغب في القيام بذلك الآن، فيجب علي النسخ إلى إصدار مؤقت من الملف والاحتفاظ فقط بالتغييرات التي أريد الالتزام بها في الإصدار الحالي، ثم نسخ الإصدار المؤقت إلى الإصدار الحالي مرة أخرى بعد الالتزام.إنها مجرد مشكلة ويجب أن يكون البرنامج قادرًا على القيام بذلك نيابةً عني.

سمعت أن Git يدعم هذا، فيرجى إخباري إذا كان هذا صحيحًا.

هل كانت مفيدة؟

المحلول

يمكن لـ Mercurial القيام بذلك باستخدام سِجِلّ امتداد.

سيطالبك بكل ملف وكل قطعة كبيرة مختلفة.على سبيل المثال:

% 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...

بعد الالتزام، سيتم ترك الفرق المتبقي:

% 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

وبدلاً من ذلك، قد تجد أنه من الأسهل استخدام MQ (قوائم الانتظار الزئبقية) لفصل التغييرات الفردية في مستودعك إلى تصحيحات.هناك متغير MQ للتسجيل (qrecord) أيضًا.

تحديث: حاول أيضًا كريكورد الامتداد، الذي يوفر واجهة لعنات لاختيار القطعة/الخط.

crecord screenshot

نصائح أخرى

نعم، بوابة يسمح لك أن تفعل هذا.ال git add الأمر لديه -p (أو --patch) الخيار الذي يسمح لك بمراجعة تغييراتك قطعة تلو الأخرى، وتحديد أي منها تريد تنظيمه (يمكنك أيضًا تحسين الكتل أو تحرير التصحيحات الموجودة في مكانها).يمكنك أيضًا استخدام الوضع التفاعلي لـ git-add (git add -i) واستخدم الخيار "p".

وهنا أ Screencast على الإضافة التفاعلية والذي يوضح أيضًا ميزة التصحيح الخاصة بـ git add.

تحقق من TortoiseHG، الذي سيجري تحديدًا كبيرًا ويتيح لك تنفيذ تغييرات مختلفة على ملف واحد فيما يتعلق بالتزامات مختلفة.

سيسمح لك أيضًا بتنفيذ كافة التغييرات على بعض الملفات مع تغييرات جزئية على ملفات أخرى في التزام واحد.

http://tortoisehg.bitbucket.io/

سألت أ سؤال مماثل منذ فترة قصيرة فقط، والإجابة الناتجة عن استخدام ملحق hgshelve كان بالضبط ما كنت أبحث عنه.

قبل القيام بالالتزام، يمكنك وضع التغييرات من ملفات مختلفة (أو مجموعة كبيرة من التغييرات داخل ملف) على "الرف" ثم تنفيذ الأشياء التي تريدها.وبعد ذلك يمكنك إلغاء التغييرات التي لم تلتزم بها ومواصلة العمل.

لقد كنت أستخدمه في الأيام القليلة الماضية وأعجبني كثيرًا.من السهل جدًا تصورها واستخدامها.

يوفر Mercurial الآن خيارًا --interactive (أو -i) إلى commit الأمر، الذي يتيح هذه الوظيفة مباشرة خارج الصندوق.

يعمل هذا مباشرة من سطر الأوامر لذا فهو مثالي إذا كنت من عشاق سطر الأوامر!

جري

> hg commit -i

تبدأ جلسة تفاعلية تسمح بفحص وتحرير وتسجيل التغييرات الفردية لإنشاء التزام.

هذا يتصرف بشكل مشابه جدًا لـ --patch و --interactive خيارات ل git add و git commit الأوامر.

أنصح بعدم العمل بهذه الطريقة.

إذا كان عليك إجراء مجموعات من التغييرات، والمجموعة A الجاهزة للتسجيل ومجموعة B التي ليست جاهزة بعد، فكيف يمكنك التأكد من أن تسجيل المجموعة A فقط لن يؤدي إلى كسر البناء/الاختبارات الخاصة بك؟قد تفوتك بعض الأسطر، أو تنسى الأسطر الموجودة في ملف مختلف، أو لا تدرك تبعية A على B الذي يكسر البنية للآخرين.

يجب أن تكون التزاماتك عبارة عن تغييرات ذرية سرية لا تؤدي إلى كسر البنية بالنسبة لك او اخرين على فريقك.إذا كنت تلتزم بملف جزئيًا، فإنك تزيد بشكل كبير من فرص كسر التصميم للآخرين دون معرفة ذلك حتى يطرق زميل العمل غير السعيد بابك.

السؤال الكبير هو، لماذا تشعر بالحاجة إلى العمل بهذه الطريقة؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top