كيف أعد تشغيل ارتكاب بلدي من مستودع جيت محلي، على رأس مشروع أزعجته على Github.com؟

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

  •  12-09-2019
  •  | 
  •  

سؤال

نعم، أعلم أنني يجب أن أزعجنا المشروع من البداية، لكن هذا هو ما وضعته الآن. :)

لدي مستودع GIT محلي يحتوي على مدونتي، على جهاز الكمبيوتر المحلي، الذي يحتوي على عدة أشهر من تاريخ الالتزام. في الأصل، قمت ببساطة بتنزيل الملفات من المستودعhttp://github.com/mojombo/mojombo.github.com., ، واستمرت مع مستودع GIT المحلي الخاص بي، مع الالتزام الأول يظهر مثل أحدث الملفات من مستودع Mojombo.

أرغب الآن في شوكة المشروع ولدي إعادة تشغيل مستودع الجيت المحلي الخاص بي على رأسه، لذلك يبدو أنني قد تهرب من المشروع من البداية، ثم دفعته إلى نسختي المترتبة على مستودع Mojombo، على جيثبتي الحساب:

http://github.com/program247365/mojombo.github.com.

لذلك ربما يبدو التاريخ بعد ذلك:

mobjombo repository:         1---2---3----23
                                  \
my blog repository commits:       24---25---

ما هي أوامر GIT التي يمكنني استخدامها بالضبط للقيام بذلك؟

لقد نظرت في هذا السؤال. وبعد هل يجب علي إضافة مستودع Mojombo كتميز إلى مشروعي، ثم اسحبه، دمج، حل النزاعات، ثم دفع إلى مشروعي المترى على جيثب؟

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

المحلول 2

عندما حاولت git pull أعطاني الخطأ التالي:

$ git pull grid master:master
! [rejected]        master     -> master  (non fast forward)

في حالتي الخاصة، بدا ذلك git rebase كان الطريق للذهاب بالنسبة لي، كما هو موضح بالخطوات هنا:

#Clone my forked project from github
git clone git@github.com:program247365/mojombo.github.com.git 

#Add my repo as a remote repo, with the alias 'grid'
git remote add grid "path/to/remote/gitrep/with/all/history/unrelated/to/mojombo/" 

#Rebase my commits on top of mojombo's
git rebase master grid/master

#Switch to the local master branch 
git checkout master

#Call up my mergetool via git, to start rectifying the conflicts that emerge between my repo, and mojombo's
git mergetool

#Push my rebased/combined repo back to Github.com
git push github

نصائح أخرى

بالمختصر:

حل واحد هو استخدام طعم لتوصيل التاريخ، ثم استخدم git filter-branch لإعادة كتابة التاريخ وفقا لتلك الترقيع، ثم تفعل اختياريا دمج.

لاحظ أن الحل لإعادة تشغيل التغييرات (ارتكبتك) على رأس التطوير الجديد في مستودع الأصلي ( repase. الحل) هو حل آخر قابل للتطبيق.


نسخة أطول:

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

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

إذا لم تقم بإحضار المشروع في مستودع مع أعمالك المنفصلة المحلية، فيمكنك القيام بذلك مع:

$ git remote add origin git://github.com/mojombo/mojombo.github.com.git
$ git fetch origin

يبدو التاريخ الآن مثل ما يلي:

* --- * --- * --- * --- *-- * * --- * --- *- * <--- أصل / ماجستير (فرع تتبع عن بعد) x --- y --- * --- *- * * <--- ماجستير (تاريخ قطع الاتصال المحلي)

الالتزام المسمى في المخطط أعلاه هو البدء في الالتزام بالتنزيل كقسم وبدأ تطويرك المحلي.

هناك احتمالان: هل لديك لقطة مفضلة من "A" كإجراء أولية "X"، أو الالتزام الأول الذي قمت به هو مع تعديلاتك المحلية.

في الحالة الأولى (كنت قد ارتكبت حالة البداية الأصلية، مثل "الالتزام الأولي" أو "الاستيراد")، فأنت تريد أن يبدو التاريخ المتصل بهذا الشكل:

* --- * --- * --- * --- *-- * * --- * --- *- * <--- أصل / ماجستير (فرع تتبع عن بعد)   -y --- * --- * --- * <- ماجستير (التاريخ المحلي غير المتصل)

أي أول ارتكابك الأصلي "Y" للحصول على "A" كوالد.

في الحالة الثانية (كنت قد ارتكبت بتغييراتك) تريد أن تبدو التاريخ المتصل مثل هذا بدلا من ذلك:

* --- * --- * --- * --- *-- * * --- * --- *- * <--- أصل / ماجستير (فرع تتبع عن بعد)   -x --- ذ --- * --- *- * <--- ماجستير (تاريخ قطع الاتصال المحلي)

أي أنك تريد الالتزام أولا "X" بأن يكون لديك "A" كوالد.

في كلتا الحالتين التي ترغب في العثور على معرف SHA-1 الكامل للالتزام معرفات "A" و SHA-1 الكامل للتنزه "X" و "Y".

يمكنك أن تجد Sha-1 من الالتزام "A" (على افتراض أنك لا تعرف ذلك بالفعل) جيت المراجعة:

$ git rev-parse A     # or A^{commit}
437b1b20df4b356c9342dac8d38849f24ef44f27

(قد تكون هناك حاجة إلى لاحقة لاحقة "^ ort}" للتأكد من أنك وجدت ارتكب Sha-1، وهو أمر مهم إذا كنت تعرف "A" من خلال علاماته، مثل "V0.99"؛ في حالتك ليست ضرورية، لأن المستودع المعني لا يستخدم علامات).

يمكنك أن تجد Sha-1 من يرتكب 'x' و 'y' باستخدام جيت ريف - قائمة (على افتراض أنك تم تطويرك على فرع "سيد"):

$ git rev-list --topo-order master | tail -2
8bc9a0c769ac1df7820f2dbf8f7b7d64835e3c68
e83c5163316f89bfbde7d9ab23ca2e25604af290

(ال "| tail -2"هنا لإيجاد آخر اثنين يرتكب في قائمة الناتجة؛ لا تحتاج إلى استخدامه إذا لم يكن لديك).

ملحوظة: في جميع الأمثلة فوق Sha-1 الكامل أمثلة, ، ولا ينبغي أن تستخدم كما هو!

دعونا اسم الالتزام الذي تريد أن يكون لديك "(أو" ابدأ "(أو" ابدأ ") كوالد كأول (سيكون" س "أو" y "، اعتمادا على حالتك، كما هو مذكور أعلاه). الآن نستخدم آلية الترقيع لتوصيل التاريخ:

$ echo "<SHA-1 of FIRST> <SHA-1 of START>" > .git/info/grafts

ثم يجب عليك التحقق مما إذا كان لديك الآن محفوظات متصلة بشكل صحيح (مطلوب)، باستخدام مستعرض محفوظات رسومية مثل GITK، أو QGIT، أو GITX، هل أنت على MacOS X، أو حتى "git log --graph"، أو "git show-branch"، على سبيل المثال:

$ gitk master origin/master    # or --all

(حيث Gitk هنا فقط كمثال؛ إذا كنت تستخدم "git show branch"لا يمكنك دائما استخدام"--all' اختيار).

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

$ git filter-branch master

سيكون لديك تاريخ الأصلي (غير متصل) في "Refs / Original / Master".

الآن يمكنك إزالة ملف الطوباء:

$ rm .git/info/grafts

الآن ستكون قادرا على الاندماج في تطوير جديد للمستودع الأصلي:

$ git merge origin/master

إعداد تكوين لكل فرع، بحيث يكون كافيا للقيام ببساطة "GIT STUTE" عند بدء تشغيل التغييرات في مستودع "دمج" في الأصل (al) بممارسة تمارين للقارئ ...: - في


ملحوظة: ال Rebase Solution. من شأنه أن يؤدي إلى التاريخ التالي (على افتراض أن لدينا قضية حيث كان أول شركة Comit استيراد بسيط):

* --- * --- * --- * --- *-- * * --- * --- *- * <--- أصل / ماجستير (فرع تتبع عن بعد)    "--- *" --- * '- *' <--- ماجستير (التاريخ المحلي غير المتصل)

(أين y' يعني أن الالتزام y تم تعديله: يجب أن يكون حول نفس التغييرات، لكنه مختلف كالتزام).

إليك فكر على ما يمكنك القيام به. إنه نوع من العكس من الفكرة التي تلخيصها في أسفل سؤالك.

  1. شوكة ريبو ماجومبو في جيثب.
  2. استنساخ نسخة ممدودة الخاص بك.
  3. دمج في التغييرات الخاصة بك من مستودعك الحالي (الأصلي).
  4. احذف مستودعك الأصلي (إذا رغبت في ذلك، لكنك لا تحتاجها حقا بعد الآن).

لذلك في الأساس، بعد الإفراط في Github، قد تستخدم التسلسل التالي للأوامر:

$ git clone git://github.com/$YOUR_USERNAME/$YOUR_PROJECT.git  # Clone your GitHub fork (#2 from above)
$ git pull /path/to/your/original/repo master:master           # Clone your original repo's master branch into your new repo (cloned from GitHub)
$ rm -rf /path/to/your/original/repo                           # Might as well delete the original -- you don't need it anymore, since all your history is in your new repo

باختصار، ستندم هذه الطريقة في جميع التغييرات التي أجريتها في الريبو الأقدم (وبالتالي الحفاظ على سجل التطوير الخاص بك)، مع سحب تاريخ Mojombo أيضا و السماح لك بمواكبة تغييرات Mojombo تساهم بسهولة التغييرات مرة أخرى إلى Repo، إن أمكن.

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