कैसे पूरे संदर्भ के साथ अंतर पाने के लिए?


114

क्रूस में समीक्षा के लिए उपयुक्त पैच कैसे बनाएं?

git diff branch master --no-prefix > patch

यह संदर्भ की केवल 3 लाइनें उत्पन्न करता है। इसलिए मैं निम्नलिखित कार्य करता हूं

git diff --unified=2000 branch master --no-prefix > patch

उम्मीद है कि सभी फाइलों में 2000 से कम लाइनें होंगी। क्या अधिकतम लाइन निर्दिष्ट किए बिना पैच के लिए फ़ाइल में सभी लाइनों को शामिल करने के लिए गिट को बताने का एक तरीका है?


3
मैंने पूरी फ़ाइल दिखाने के लिए -U <infinity> विकल्प पोस्ट किया, एक अलग प्रश्न के रूप में stackoverflow.com/questions/28727424/…
हांग्जो लेवचुक

जवाबों:


54

मुझे पता है कि यह पुराना है, लेकिन मैं हार्ड-कोडेड समाधान भी नापसंद करता हूं, इसलिए मैंने इसका परीक्षण किया:

git diff -U$(wc -l MYFILE)

यू का उपयोग करना समस्या को एप्रोच करने का एकमात्र तरीका लगता है, लेकिन लाइन काउंट का उपयोग यह वादा करता है कि यह एक बहुत बड़ी फाइल में एक छोटे से बदलाव के लिए भी काम करेगा।


1
<इसकी आवश्यकता नही है। git diff -U$(wc -l MYFILE) MYFILE
बाल्की

2
धन्यवाद @balki, मैंने आपके सुझाव की कोशिश की और ध्यान दिया कि <pre> $ (wc -l MYFILE) </ pre> फ़ाइल नाम के बाद की पंक्ति संख्या तक विस्तृत है, इसलिए फ़ाइल नाम का दूसरा उपयोग भी छोड़ा जा सकता है। मैं इसे दर्शाने के लिए अपने उत्तर को अपडेट कर रहा हूं।
एज्रा

4
यह एक अंतर है, फ़ाइल के दो संस्करण हैं। क्या होगा अगर डिस्क पर संस्करण दो बार लंबे समय तक नहीं था? वास्तव में बड़ी संख्या के साथ -U वास्तव में सुरक्षित नहीं है?
एल्फ

@Eloff, यह सच है, सबसे अच्छा तरीका अधिकतम लंबाई होगा, क्योंकि वास्तव में बड़ी संख्या में अभी भी विपरीत समस्या है। यह समाधान मानता है कि डिस्क पर वर्तमान फ़ाइल आकार से बड़ा कोई सन्निहित विलोपन नहीं किया गया था।
एज्रा

3
git diff -U$(wc -l MYFILE | awk '{print $1}') MYFILEएक बेहतर जवाब है कि wcदो तर्कों को बनाने के लिए केवल एक व्हाट्सएप के बिना लाइनों की संख्या प्राप्त करके, सबटाइटल के निर्विरोध आउटपुट पर निर्भर न होकर, और macOS / BSD पर काम करता है।
ऐशपेटेल

94

यह बहुत अच्छी तरह से काम करने लगता है:

git diff --no-prefix -U1000

कैवियट के साथ:

-Uझंडा संदर्भ की तर्ज निर्दिष्ट करता है। यदि आपके परिवर्तनों के बीच 1000 से अधिक लाइनें हैं, तो आपको इसे बढ़ाने की आवश्यकता हो सकती है।


16
-Uविकल्प आपको सुझाव है कि रूप में ही है --unified=प्रश्नकर्ता द्वारा इस्तेमाल किया विकल्प। अंतर केवल इतना है कि आप संदर्भ की कम पंक्तियों को निर्दिष्ट करते हैं, 1000, पूछने वाले के उपयोग की तुलना में, 2000। @balki जानना चाहते थे कि अनंत तक संख्या कैसे बढ़ाई जाए, फिर भी आप संख्या को आधे में काटने का सुझाव देते हैं। क्यों?
एलएस

4
@ एलएस: हाँ, मुझे अब एहसास हुआ है, लेकिन अनदेखी है कि कुछ साल पहले। फिर भी, यह थोड़ा अधिक स्पष्ट है कि प्रश्न की तुलना में क्या हो रहा है और यह उस अजीब व्यक्ति की मदद करने में लगता है जो यहां लैंड करता है।
c24w

इसके लिए धन्यवाद, यह भी साथ काम करता है git show!
शकील

@ c24w सहमत, फिर भी मुझे वही मिलता है जो मैं स्क्रीन पर देखना चाहता हूं।
शेफ फिरौन

1
--no-prefixविकल्प "/ एक /" और "/ बी /" गंतव्य उपसर्गों कि डिफ़ॉल्ट रूप से दिखाई से छुटकारा मिलता है। (लिंक पेज)
luckydonald

10

नोट: git1.8.1rc1 घोषणा (8 दिसंबर, 2012) में शामिल हैं:

diff.contextपैच आउटपुट में संदर्भ लाइनों की डिफ़ॉल्ट संख्या को देने के लिए एक नया कॉन्फ़िगरेशन चर " " का उपयोग किया जा सकता है, 3 लाइनों के हार्डकोड डिफ़ॉल्ट को ओवरराइड करने के लिए।

ताकि मदद मिल सके, यहाँ, एक अधिक संपूर्ण संदर्भ उत्पन्न करें।


7
फिर भी उसके पास 'फ़ाइल में सभी पंक्तियाँ' कहने का विकल्प नहीं है
बाल्की

3
मुझे संदेह है कि एक बड़ी संख्या डालते हुए, जो "सभी पंक्तियों" का अनुकरण करेगा
VONC

7
"मुझे संदेह है कि एक बड़ी संख्या डालते हुए, जो" सभी लाइनों "का अनुकरण करेगा ..." को छोड़कर जब ऐसा नहीं होता है और तब चीजें टूट जाती हैं। सब अनंत का पर्याय है, और एक बहुत बड़ी संख्या बस यही है - एक संख्या, अनंत नहीं।
ट्रेंटन

4

प्रेरणा मिली और इसलिए मैंने एक उपनाम उर्फ ​​जोड़ा।

$ cat ~/.gitconfig | fgrep diff
        df = "!git diff -U$(wc -l \"$1\" | cut -d ' ' -f 1) \"$1\""
$ git df <file>

अपडेट करें:

बस पाया गया "git df" कभी-कभी काम नहीं करता है, निर्देशिका परिवर्तन के कारण जब git उपनाम को निष्पादित किया जाता है। (देखें गलत उपनाम गलत निर्देशिका में काम करते हैं )। तो यह अद्यतन संस्करण है:

$ cat ~/.gitconfig | fgrep df
        df = "! [ \"$GIT_PREFIX\" != \"\" ] && cd \"$GIT_PREFIX\"; ~/bin/git_df.sh"
$ 
$ cat ~/bin/git_df.sh
#!/bin/bash
for FILE in $@; do
    git diff -U$(wc -l "${FILE}" | cut -d ' ' -f 1) "${FILE}"
done
exit 0


0

पहले से स्वीकार किए गए समाधान मेरे लिए काम नहीं करते हैं जब कोई विशिष्ट फ़ाइल / कमिट ( -Uविकल्प रिवाइज / पाथ पार्सिंग में गड़बड़ी --inter-hunk-context=करता है ), लेकिन इस मामले में काम करता है git version 2.24.0:

git diff \
    --no-prefix \
    --inter-hunk-context=2000 \
    master -- \
        path/to/file.py

यदि आपको फ़ाइल का आकार नहीं पता है, तो आप इसे wc -lहार्ड-कोडिंग के बजाय इसे पा सकते हैं :

git diff \
    --no-prefix \
    --inter-hunk-context=$(wc -l path/to/file.py) \
    master -- \
        path/to/file.py
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.