आप बाइनरी ब्लोट को हटा सकते हैं और अपने शेष इतिहास को रख सकते हैं। Git आपको पूर्व स्क्वैश और 'स्क्वैश' करने की अनुमति देता है, इसलिए आप अपनी बड़ी बाइनरी फ़ाइलों को जोड़ने और हटाने के लिए बस कमिट्स को जोड़ सकते हैं। यदि सभी एक कमेटी में किए गए हैं और दूसरे में रिमूवल हैं, तो यह प्रत्येक फ़ाइल से निपटने की तुलना में बहुत आसान होगा।
$ git log --stat # list all commits and commit messages
अपनी बाइनरी फ़ाइलों को जोड़ने और हटाने वाले कमिट के लिए यह खोजें और उनके SHA1s को नोट करें, 2bcdef
और 3cdef3
।
फिर रेपो के इतिहास को संपादित करने के लिए, rebase -i
अपने इंटरैक्टिव विकल्प के साथ कमांड का उपयोग करें , जहां आप अपने बायनेरिज़ को जोड़ते हैं, उसके माता-पिता के साथ शुरू करते हैं। यह आपके $ EDITOR को लॉन्च करेगा और आपको शुरू होने वाले कमिट की एक सूची दिखाई देगी 2bcdef
:
$ git rebase -i 2bcdef^ # generate a pick list of all commits starting with 2bcdef
# Rebasing zzzzzz onto yyyyyyy
#
# Commands:
# pick = use commit
# edit = use commit, but stop for amending
# squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
pick 2bcdef Add binary files and other edits
pick xxxxxx Another change
.
.
pick 3cdef3 Remove binary files; link to them as external resources
.
.
squash 3cdef3
दूसरी पंक्ति के रूप में सम्मिलित करें और उस पंक्ति को हटा दें जो pick 3cdef3
सूची से कहती है। अब आपके पास इंटरैक्टिव के लिए क्रियाओं की एक सूची है rebase
जो उन कमिटों को जोड़ती है जो आपके बायनेरिज़ को एक कमिट में जोड़ते हैं और हटाते हैं जिनका अंतर उन कमिट्स में बस किसी भी अन्य परिवर्तन है। तब यह क्रम में आने वाले सभी के बाद फिर से लागू होगा, जब आप इसे पूरा करने के लिए कहेंगे:
$ git rebase --continue
इसमें एक या दो मिनट का समय लगेगा।
अब आपके पास एक रेपो है जो अब बायनेरिज़ के आने या जाने का नहीं है। लेकिन वे अभी भी जगह लेंगे, क्योंकि डिफ़ॉल्ट रूप से, Git लगभग 30 दिनों के लिए परिवर्तन करता रहता है, इससे पहले कि वे कचरा एकत्र कर सकें, ताकि आप अपना मन बदल सकें। यदि आप उन्हें अभी निकालना चाहते हैं:
$ git reflog expire --expire=1.minute refs/heads/master
#all deletions up to 1 minute ago available to be garbage-collected
$ git fsck --unreachable # lists all the blobs(files) that will be garbage-collected
$ git prune
$ git gc
अब आपने ब्लोट को हटा दिया है लेकिन अपने शेष इतिहास को रखा है।