باستخدام GIT-Filter-Branch مرارًا وتكرارًا لإعادة كتابة ارتباطات جديدة

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

  •  21-09-2019
  •  | 
  •  

سؤال

أرغب في تقسيم الوحدات النمطية الموزعة بتطبيق أكبر في أوامر فرعية منفصلة والحفاظ على القدرة على السحب من المنبع.

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

ببساطة إعادة تشغيل فرع المرشح GIT على التاريخ الكامل من المنبع الآن بما في ذلك الالتزامات الجديدة التي لم يتم العثور عليها في تاريخ إعادة كتابتي ليست خيارًا لأن هناك المئات من الوحدات النمطية التي يتعين علي القيام بذلك وعدد الالتزامات يقترب من 100.000 .

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

سيكون من الرائع أن يتم الحفاظ على الفروع والعلامات أيضًا ولكن هذا ليس ضروريًا تمامًا ، وإذا كان ذلك يعقد الأشياء ، فأنا أفضّل فقدانها فعليًا.

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

المحلول

لأول مرة ريباس تفعل هذا:

git checkout -b rebased master
git filter-branch --some-filter
git tag rebased-done master

و "الاندماج" تلتزم فيما بعد:

# Create a tempory branch and rebase it's tail use 'rebase-done~'
# and not 'rebase-done' because some filters (like --index-filter)
# require this, others might not.
git checkout -b rebased-tail master
git filter-branch -f --some-filter -- rebased-done~..HEAD

# Get the commit in branch 'rebased' corresponding to tag 'rebase-done'
# (which tags a commit in 'master' not 'rebased').  Depending on your
# situation you might have to determine this commit differently (in my
# use case I am absolutely sure that there is never a commit with the
# same author date - if that doesn't work you might want to compare
# commit messages).
start_time=$(git show --quiet --pretty=%at rebased-done)
start_hash=$(
git log --reverse --pretty="%H %at" rebased_tail |
while read hash time
do
    [ "$time" = "$start_time" ] && echo $hash && break
done
)

# Finally apply the rebased commits.
git checkout rebased
git format-patch -k --stdout $start_hash..rebased-tail | git am -k
git branch -D rebased-tail
git tag -f rebased-done master
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top