تحديد ما إذا كان التزام البتر هو التزام دمج/عودة

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

سؤال

أنا أكتب نصًا يتطلب التحقق مما إذا كان التزام معين هو التزام دمج/عودة أم لا ، وأنا أتساءل عما إذا كانت هناك خدعة كبيرة لذلك.

ما توصلت إليه حتى الآن (وأنا بالتأكيد لا أريد الاعتماد على رسالة الالتزام هنا) هو التحقق 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top