تحديد ما إذا كان التزام البتر هو التزام دمج/عودة
-
26-09-2019 - |
سؤال
أنا أكتب نصًا يتطلب التحقق مما إذا كان التزام معين هو التزام دمج/عودة أم لا ، وأنا أتساءل عما إذا كانت هناك خدعة كبيرة لذلك.
ما توصلت إليه حتى الآن (وأنا بالتأكيد لا أريد الاعتماد على رسالة الالتزام هنا) هو التحقق HASH^2
ومعرفة ما إذا لم أحصل على خطأ ، هل هناك طريقة أفضل؟
المحلول
اكتشاف ما إذا كان هناك شيء ما هو سهلة. هذا كله يرتكب مع أكثر من والد واحد. للتحقق من ذلك ، يمكنك القيام بذلك ، على سبيل المثال
$ git cat-file -p $commit_id
إذا كان هناك أكثر من خط "الوالد" في الإخراج ، فقد وجدت دمجًا.
من أجل العودة ليست سهلة. عمومًا تعود العوائق العادية التي تحدث لتطبيق فروع التزام سابق في الاتجاه المعاكس ، مما يؤدي إلى إزالة التغييرات التي تم تقديمها بشكل فعال. لا يوجد مميز خلاف ذلك.
إذا تم إنشاء عودة مع git revert $commit
, ، ثم يقوم Git عادةً بإنشاء إشارة إلى رسالة الالتزام إلى العودة وما الذي ارتكبه. ومع ذلك ، من الممكن تمامًا القيام بالعودة بطرق أخرى ، أو مجرد تغيير رسالة الالتزام التي تم إنشاؤها بواسطة git revert
.
قد يكون البحث عن رسالة الالتزام التي تم إنشاؤها والتي تم إنشاؤها بالفعل أمرًا جيدًا بما يكفي لما تحاول تحقيقه. إذا لم يكن الأمر كذلك ، فسيتعين عليك أن تنظر فعليًا من خلال الالتزامات الأخرى ، ومقارنة فرقها ضد بعضها البعض ، فإن النظر إلى أحدهم هو التشغيل العكسي الدقيق لآخر. لكن حتى هذا ليس حلاً جيدًا. غالبًا ما تختلف التعودات الكافية قليلاً عن عكس الالتزام الذي يعودونه ، على سبيل المثال لاستيعاب تغييرات الكود التي حدثت بين الالتزام والعودة.
نصائح أخرى
سوف تعليمات التالية التخلص منها فقط تجزئة الوالدين. أقل تصفية مطلوبة ...
git show --no-patch --format="%P" <commit hash>
الجواب باستخدام git cat-file
يستخدم git "السباكة" الأمر ، الذي يعد أفضل عمومًا لبناء البرامج النصية حيث من غير المحتمل أن يتغير تنسيق الإخراج. الذين يستخدمون git show
و git rev-parse
قد تحتاج إلى التغيير بمرور الوقت أثناء استخدامهم الخزف الأوامر.
وظيفة bash التي كنت أستخدمها لفترة طويلة تستخدم git rev-list
:
gitismerge () {
local sha="$1"
msha=$(git rev-list -1 --merges ${sha}~1..${sha})
[ -z "$msha" ] && return 1
return 0
}
يمكن العثور على قائمة أوامر الخزف/السباكة في المستندات للمستوى العلوي شخص سخيف يأمر.
يستخدم هذا الرمز git-rev-list مع محدد Gitrevisions استفسار ${sha}~1..${sha}
بطريقة تطبع الوالد الثاني لشا في حالة وجودها ، أو لا شيء إذا لم يكن موجودًا ، وهو التعريف الدقيق لالتزام الدمج.
خاصة، SHA~1..SHA
يعني قم بتضمين الالتزامات التي يمكن الوصول إليها من SHA ولكن استبعاد تلك التي يمكن الوصول إليها sha ~ 1 ، والتي هي أول والد شا.
يتم تخزين النتائج في $ MSHA واختبارها للفراغ باستخدام باش [ -z "$msha" ]
فشل (العودة 1) إذا فارغة ، أو تمر (العودة 0) إذا كان غير فارغ.
طريقة واحدة لاختبار الالتزام بدمج:
$ test -z $(git rev-parse --verify $commit^2 2> /dev/null) || echo MERGE COMMIT
أما بالنسبة لصالح GIT ، فأنا أتفق مع rafl أن النهج الأكثر واقعية هو البحث عن ملهى الرسائل REVERT في رسالة الالتزام ؛ إذا قام شخص ما بتغييره ، فسيكون ذلك متورطًا للغاية.
طريقة سهلة لاختبار الالتزام بدمج:
git show --summary HEAD | grep -q ^Merge:
سيعود هذا 0 لعملية Merge ، 1 لالتزامات غير حادة. استبدل الرأس بالالتزام المطلوب للاختبار.
مثال الاستخدام:
if git show --summary some-branch | grep -q ^Merge: ; then
echo "some-branch is a merge"
fi
طريقة أخرى للعثور على والدا الالتزام:
git show -s --pretty=%p <commit>
يستخدم %P
للتجزئة الكاملة. هذا يطبع كم عدد الآباء HEAD
لديها:
git show -s --pretty=%p HEAD | wc -w