سؤال

لدي مستوا واحدا، أحدهما هو الريبو الرئيسي للمكتبة، والآخر هو مشروع يستخدم تلك المكتبة.

إذا قمت بإصلاح في مشروع Subservient، فأنني أفضل طريقة سهلة لتطبيق هذا التصحيح مرة أخرى.

موقع الملف يختلف في كل مستودع.

  • الريبو الرئيسي: www.playdar.org/static/playdar.js
  • المشروع: playlick.com/lib/playdar.js

حاولت استخدام git format-patch -- lib/playdar.js على مشروع Playlick، ثم git am على الريبو PlayDar الرئيسي، ولكن مواقع الملفات المختلفة في ملف التصحيح أثار خطأ.

هل هناك طريقة سهلة لتطبيق التصحيح من الالتزام المعطى بملف معين إلى ملف تعريفي آخر آخر؟

للحصول على نقاط المكافأة، ماذا لو كان الملف الذي تريد تطبيق التصحيح فيه ليس في مستودع GIT؟

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

المحلول

إذا كان تحرير ملف التصحيح يدويا من السؤال أو غير ممكن، فيمكن القيام بذلك مع خيارات قياسية (متوفرة git apply, git format-patch و gnu. patch).

  1. -p<n> يزيل n الأدلة الرائدة من المسارات في التصحيح.

  2. بعد المعالجة -p, --directory=<root> الإفراج root لكل من المسارات في التصحيح قبل التقديم.

مثال

لذلك، على سبيل المثال الخاص بك، لأخذ تصحيح كان في الأصل static/playdar.js وتطبيقه على lib/playdar.js, ، سوف تعمل:

$ cat patch_file | git am     \ 
          -p1                 \ # remove 1 leading directory ('static/')
         --directory='lib/'     # prepend 'lib/'

نصائح أخرى

التصحيح المنتج git format-patch هو ببساطة ملف نصي - يمكنك تحرير رؤوس Diff بحيث يقوم بتعديل مسار مختلف.

لذلك على سبيل المثال، كان قد أنتج شيئا مثل هذا:

diff --git a/lib/playdar.js b/lib/playdar.js
index 1234567..89abcde
-- a/lib/playdar.js
++ b/lib/playdar.js

كل ما عليك فعله هو التغيير lib/playdar.js ل static/playdar.js ثم قم بتشغيل التصحيح من خلال git am"

يجب أن يكون التصحيح قابل للقراءة من قبل فائدة جنو القياسية للأشخاص الذين لا يملكون git--- لكن لا تعمل format-patch مع ال -M, -C الخ خيارات لإنتاج تصحيحات إعادة تسمية في هذه الحالة، لأن الدعم لهم ليس عالميا.

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

بمعنى آخر، أضف "الريبو الرئيسي" كخضور في "مشروع". كلما ارتكب / دفع أشياء جديدة في "الريبو الرئيسي"، أنت فقط git pull يعودون إلى "مشروع".

لإكمال إجابة هنريك, ، والذهاب إلى نقطة المكافأة

ماذا لو كان الملف الذي تريد تطبيق التصحيح لعدم وجوده في مستودع جيت؟

إذا كان لديك حق الوصول إلى أدلة مرشح الملفات للحصول على تصحيح قادمة من مستودع GIT، فيمكنك أولا تحويل هذه الشجرة من الدلائل / الملفات إلى مستودع GIT نفسه! (git init': مستودع جيت هو مجرد. جيت داخل الدليل الجذر بعد كل شيء).
ثم ستقوم بتعيين هذا الريبو كخضوع لمشروعك الرئيسي.

يمكنك إضافة جهاز التحكم عن بعد جديد وسحب منه. مقالة مع التفاصيل.

$ cd <path-to-repoB>
$ git remote add repoA <git-URL-for-repoA>
$ git pull repoA

أعتقد أن الفرعية هي الحل الأفضل لمشكلتك

البرنامج التعليمي 1.

tuorial 2.

يمكنك فقط إزالة (إعادة تسمية) مؤقتا المستودع الرئيسي.

cd to/main/project
mv .git .git_
cd to/sub/project
git apply patchname
cd -
mv .git_ .git

باستخدام --relative الخيار ل format-patch يمكن تحسين التجريد (إخفاء تفاصيل غير ذات صلة حول المستودع الذي تم إنشاؤه التصحيح منه).

[repository-with-changes]
git format-patch --relative=(path-to-library) (base-commit-for-patch) ## 'HEAD~1'

لقد وجدت --3way الخيار لتكون مطلوبة عند تطبيق التصحيح (لتجنب does not exist in index خطأ) - قد تختلف الأميال الخاص بك. استخدام --directory=(...) من المرجح أن يكون ذلك ضروريا فقط إذا كان المسار المستهدف ليس جذر المستودع.

[repository-to-update]
git am --3way --directory=(path-to-library) (patch-file)

  • format-patch سيخلق ملف تصحيح واحد لكل يلتزم الفرع الحالي منذ "قاعدة".

  • الوثائق ل --relative يبدو أن الخيار مفقود في بعض الحالات, ، ولكن يبدو أن العمل على أي حال (اعتبارا من الإصدار 2.7.4).

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