كيفية تطبيق التصحيح GIT من مستودع إلى آخر؟
-
06-09-2019 - |
سؤال
لدي مستوا واحدا، أحدهما هو الريبو الرئيسي للمكتبة، والآخر هو مشروع يستخدم تلك المكتبة.
إذا قمت بإصلاح في مشروع 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
).
-p<n>
يزيلn
الأدلة الرائدة من المسارات في التصحيح.بعد المعالجة
-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
يمكنك فقط إزالة (إعادة تسمية) مؤقتا المستودع الرئيسي.
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).