سؤال

لدي مستودع GIT (يغطي تاريخ المشروع أكثر أو أقل) ومصادر منفصلة (مجرد قطران مع القليل من الملفات) التي تعثرت منذ بعض الوقت (في مكان ما في عام 2004 أو 2005).

خضعت مصادر Tarball الكثير من التغييرات التي أود دمجها. الآن السؤال هو - كيفية معرفة ما هو في الواقع النقطة الفرعية للمصادر المتغيرة للحصول على الحد الأدنى من الفرق لما حدث هناك.

لذا فإن ما أريده أساسًا هو العثور على مكان في تاريخ GIT ، حيث يشبه الكود الأكثر تشابهاً لارتيال المصادر التي لدي. ولا أريد أن أفعل ذلك يدويًا.

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

إذا كنت تريد أن تلعب مع ذلك بنفسك ، فإن Tarball مع المصادر هنا ويتم استضافة git في جيتوريوس: git://gitorious.org/gammu/mainline.git

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

المحلول

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

من المحتمل أن يكون أفضل رهان لك هو قصر نفسك على ملفات محددة. إذا كنت تفكر في ملف واحد فقط ، فلا ينبغي أن يستغرق وقتًا طويلاً للتكرار من خلال جميع إصدارات هذا الملف (استخدم git rev-list <path> للحصول على قائمة ، لذلك ليس عليك اختبار كل التزام). لكل ملزمة قام بتعديل الملف ، يمكنك التحقق من حجم الفرق ، وإيجاد حد أدنى إلى حد ما. قم بذلك لعدد قليل من الملفات ، ونأمل أن يوافقوا!

أفضل طريقة لإعداد نفسك للانتشار هي التزام مؤقت عن طريق النسخ ببساطة في Tarball الخاص بك ، حتى تتمكن من الحصول على فرع يسمى tarball للمقارنة ضد. بهذه الطريقة ، يمكنك القيام بذلك:

git rev-list path/to/file | while read hash; do echo -n "$hash "; git diff --numstat tarball $hash path/to/file; done

للحصول على قائمة رائعة بجميع الالتزامات بأحجام النطاق (ستكون الأعمدة الثلاثة الأولى هي SHA1 ، وعدد الخطوط المضافة ، وعدد الخطوط التي تمت إزالتها). ثم يمكنك فقط أن تنشرها في awk '{print $1,$2+$3}' | sort -n -k 2, ، ولديك قائمة بالملاحظات المرتبة وأحجامها!

إذا لم تتمكن من قصر نفسك على حفنة صغيرة من الملفات للاختبار git-bisect - حاول فقط تضييق طريقك إلى فرق صغير ، مما يفترض أن على الأرجح ، فإن الالتزام بالقرب من أفضل حالتك سيكون له صوف أصغر ، ويرتكب بعيدًا عن ذلك سيكون له فرق أكبر. (في مكان ما بين طريقة نيوتن وكامل في البحث الثنائي/الشبكة ، ربما؟)

تحرير: احتمال آخر ، مقترح في إجابة دوغلاس, ، إذا كنت تعتقد أن بعض الملفات قد تكون مطابق لأولئك الذين يرتكبون بعضهم ، هو تجزئةهم باستخدام git-hash-object, ، ثم انظر إلى ما يرتكب في تاريخك لديه تلك النقطة. هناك سؤال مع بعض الإجابات الممتازة حول كيفية القيام بذلك. إذا قمت بذلك مع عدد قليل من الملفات - ويفضل أن تكون تلك التي تغيرت بشكل متكرر - فقد تكون قادرًا على تضييق الهدف يلتزم بسرعة كبيرة.

نصائح أخرى

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

استنادًا إلى ما قاله Araqnid ، توصلت إلى 9C6C864426BF88429E77C7E22B5AA78E9295B97A (طلب فقط من 0.61.0 ورأس) ربما لا يكون هذا هو الأفضل)

git rev-list --no-merges --all | while read rev; do patchsize=$(git diff $rev | wc -c); echo $patchsize $rev; done | sort -n | less

على افتراض أنك قمت باستيراد Tarball إلى git وتوقيت هذه المراجعة (لقد فعلت ذلك عن طريق فك الارتباط وبعد ذلك

git init
git add .
git commit -m "import tarball"
git remote add origin git://gitorious.org/gammu/mainline.git

لذلك بعد أن تفعل ذلك ، يجب على التشغيل أعلاه إخراج حجم جميع الاختلافات بترتيب تصاعدي للاتجاه (أول واحد سيكون 0 لأنه سيجد الرأس الحالي) سيستغرق وقتًا طويلاً ... ولكن يجب أن يجد أصغر فرق ...

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

يجب أن تكون قادرًا على القيام بذلك:

git remote add thefork git://wherever.it.lives/thefork.git

git fetch thefork

git branch -f thefork-branch thefork/branchname

git checkout thefork-branch

في هذه المرحلة ، يمكنك الجري gitk وشاهد التاريخ الكامل للفرع المتشعب ومستودعك المحلي ، ومعرفة ما إذا كان يتصل أم لا.

استيراد هذه الملفات الموجودة في Tarball إلى مراجعة GIT ، في فرع منفصل أو جديد تمامًا: الموضع في الرسم البياني للمراجعة ليس مهمًا ، نريد فقط متاحًا كشجرة.

الآن لكل مراجعة في الماجستير ، ما عليك سوى الاختلاف مع تلك الشجرة/المراجعة ('المستوردة') وإخراج فقط مدى حجم الفرق. شيء مثل:

git rev-list master | while read rev; do patchsize=$(git diff $rev imported | wc -c); echo $rev $patchsize; done

وبالتالي فإن المراجعة مع أصغر حجم التصحيح ستكون "الأقرب" ، بقاعدة تقريبية للغاية. (ستنتج مراجعة متطابقة حجم التصحيح 0 ، وسيكون أي شيء آخر بالتأكيد غير صفري ، وكلما تغير ، كلما كان أكبر).

إذا كان لديك فكرة تقريبية عن مكان حدوث الشوكة ، فكر في استخدام ويل مانلي git meld. (أنظر أيضا: عرض الاختلافات في الفروع مع MELD؟.)

للقيام بذلك ، أضف محتويات Tarball إلى مستودعك (الذي ستقوم به على أي حال). بعد تثبيت MELD و git-meld, ، يجري

git meld branch_from_tarball commit_to_check &

على ارتباطات مختلفة حتى تجد واحدة مع أقل الاختلافات. سيفتح هذا الأمر meld وعرض التغييرات في شجرة الدليل بين الالتزام المحدد ، مع وجود ملفات متطابقة مخفية. مثال لقطات الشاشة:

يظهر مولد اثنين من الالتزامات المختلفة جدا:
Very different

إظهار اثنين مماثلSimilar

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