मैं git में बाइनरी फाइलें कैसे अलग कर सकता हूं?


28

Git में बाइनरी फ़ाइलों को अलग करने के लिए, मुझे लगता है कि मुझे एक difftool सेट करने की आवश्यकता है।

क्या कार्य करता है? आप मापदंडों को कैसे लगाते हैं?


बाइनरी फ़ाइल के एक अलग उपकरण से आप किस तरह के आउटपुट की उम्मीद कर रहे हैं? यह किस तरह की बाइनरी फाइल है? क्या यह कुछ ऐसा है जिसे पाठ प्रारूप में प्रस्तुत किया जा सकता है और फिर तुलना की जा सकती है?
अक्टूबर को Zoredache

जवाबों:


22

आप textconvएक फ़ाइल नाम के लिए एक विन्यास विकल्प सेट कर सकते हैं । Gitattributes में "बाइनरी फ़ाइलों का प्रदर्शन पाठ भिन्नता " (5) देखें । आपको क्या उपयोग करना चाहिए यह फ़िलाटाइप पर निर्भर करता है।

उदाहरण 1 :

कहते हैं कि आप ज़िप फ़ाइलों की सामग्री को अलग करना चाहते हैं। उस स्थिति में आपको $ GIT_DIR / config फाइल या $ HOME / .ITconfig में निम्नलिखित को डालना चाहिए।

[diff "zip"]
    textconv = unzip -v

अगली बार जब आप रेपो में जिप फाइल पर एक अंतर पूछते हैं, तो यह unzip -vदोनों वर्जन पर कॉल करेगा और परिणामी टेक्स्ट को अलग करेगा।

उदाहरण 2 :

पीडीएफ फाइलों के लिए आप उदाहरण के लिए उपयोग कर सकते हैं pdfinfo;

[diff "pdf"]
    textconv = pdfinfo

उदाहरण 3 :

यदि किसी फ़िलाटाइप के लिए कोई विशिष्ट जानकारी नहीं है, तो आप उदाहरण के लिए hexdump(FreeBSD और OSX, लिनक्स पर भी उपलब्ध है) का उपयोग कर सकते हैं:

[diff "bin"]
    textconv = hexdump -v -C

मैं इसे हेक्स में अलग कर सकता था। मुझे यह जानकर बहुत खुशी होगी कि कितने बाइट्स अलग हैं, या बाइट्स किन स्थितियों में भिन्न हैं। मैंने अपने git रिपॉजिटरी को क्लोन करके Hex Fiend का उपयोग किया, ताकि मैं फ़ाइल के दोनों संस्करणों की जांच कर सकूं, क्योंकि मैं यह पता नहीं लगा सका कि प्रोग्राम को लॉन्च करने के लिए git कैसे लाया जाए।
निक रिटालैक

@NickRetallack: जोड़े गए उदाहरण देखें।
रोलैंड स्मिथ

2
मैंने अपने git config में उदाहरण 3 को जोड़ा, लेकिन जब मैं "git diff" करता हूं तो यह अभी भी मुझे एक ही छोटा संदेश देता है: "बाइनरी फ़ाइलें a / file और b / file अलग"
Nick Retallack

1
यदि आप कामेच्छा का उपयोग करना चाहते हैं, तो आपको यह देखने के लिए गिट सोर्स कोड देखना होगा कि क्या काम करता है ...
रोलैंड स्मिथ

5
मुझे आखिरकार यह काम करना पड़ा, * .bin diff = bin to my .gitattributes को जोड़ने के बाद
जस्टिन रोवे

11

रोलैंड स्मिथ का जवाब मददगार था लेकिन वर्तमान में अधूरा है (टिप्पणियों को देखें) - इसके दो हिस्से हैं।

आप अपनी रिपॉजिटरी की .git/configफ़ाइल या अपनी व्यक्तिगत वैश्विक ~/.gitconfigफ़ाइल में एक नई भिन्न कमांड को परिभाषित कर सकते हैं , उदाहरण के लिए हेक्स डिफरेंस कमांड का उपयोग करके hexdump:

[diff "hex"]
    textconv = hexdump -v -C
    binary = true

इसके बाद, आपको .gitattributesयह बताने के लिए रिपॉजिटरी की फाइल का उपयोग करने की जरूरत है कि कौन सी फाइलें इस विशेष अंतर कमांड के साथ उपयोग की जानी चाहिए:

# Binary files (no line-ending conversions), diff using hexdump
*.bin binary diff=hex

.gitignoreफ़ाइल की तरह, फ़ाइल .gitattributesको आपके रिपॉजिटरी में चेक किया जाना चाहिए।

मेरे मामले में मेरे पास कई अलग-अलग फ़ाइल एक्सटेंशन हैं जो मैं बाइनरी के रूप में व्यवहार करना चाहता हूं (जैसे कि विंडोज पर गिट का उपयोग करने पर किसी भी पंक्ति को समाप्त करने से बचें), और इसके माध्यम से कोई अंतर भी देखें hexdump:

https://github.com/peterjc/galaxy_blast/commit/5ec4695e6c3da3926fb100ca006f0f3e88c53c3d

एक अन्य उदाहरण के लिए https://github.com/resin-io/etcher/pull/1367 यह भी देखें कि छवि फ़ाइलों के साथ उपयोग के लिए एक हेक्सडंप अंतर कमांड को परिभाषित करना।


आप .gitattributesविश्व स्तर पर भी ( [diff]अपनी वैश्विक में प्रविष्टियों के साथ जाने के लिए) सेट कर सकते हैं .gitconfig। यदि आप .gitattributesरेपो को स्थानीय बनाते हैं , तो उपयोगकर्ता को अपनी स्थानीय .gitconfigरेपो सेटिंग्स को संशोधित करना होगा क्योंकि सुरक्षा कारणों से उन्हें रिमोट पर नहीं धकेला जाएगा। किसी भी तरह से, प्रत्येक उपयोगकर्ता को इस व्यवहार को सक्षम करने के लिए किसी तरह से अपनी स्थानीय फ़ाइलों / कॉन्फ़िगरेशन को अपडेट करना होगा। में .gitconfigके तहत [core]जोड़ने attributesfile = c:/users/<username>/.gitattributesया जहाँ भी आप अगर आप इसे वैश्विक (forwardslashes ध्यान दें, खिड़कियां में भी) यह संग्रहीत करना चाहते हैं।
लाइटसीसी

10

यदि आप बाइनरी फ़ाइलों को दिखाने के लिए गिट को बाध्य करना चाहते हैं --text, तो एक सादा पाठ का उपयोग विकल्प के रूप में भिन्न होता है:

git diff --text

-1

उपरोक्त व्यापक तरीके हैं ऐसा करने के लिए .. हालाँकि, अगर आपको इसे कुछ फ़ाइलों के लिए करने की आवश्यकता है, तो निम्न विधि वह है जो मैं उपयोग करता हूं:

git checkout HEAD -- /path/to/file > ~/file
vimdiff ~/file /path/to/file

यहाँ मैं उपयोग कर रहा हूँ vimdiffलेकिन आप किसी अन्य उपकरण का उपयोग कर सकते हैं। यदि आपको इसे बार-बार करने की आवश्यकता है, तो उपरोक्त को एक छोटी स्क्रिप्ट में भी जोड़ा जा सकता है।


ऐसा प्रतीत होता है कि उसने मेरी फ़ाइल में परिवर्तन छोड़ दिया है (और एक खाली फ़ाइल बनाई है जहाँ मैं प्रतिबद्ध संस्करण चाहता था)।
एरहानिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.