कैसे एक नई फ़ाइल के केवल हिस्से को git के साथ स्टेज करें?


222

मैं प्यार --interactive जोड़ने Git । यह अब मेरे दैनिक वर्कफ़्लो का हिस्सा है।

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

उदाहरण के लिए, git ऐड -i के साथ, मैं पैच कोड को चुन सकता हूं और यहां तक ​​कि नए कोड के कुछ हिस्सों को स्टेज करने के लिए अलग-अलग हॉक संपादित कर सकता हूं, जिससे डिबग कोड टिप्पणियों को अस्थिर किया जा सकता है। मुझे इस तरह से काम करना पसंद है क्योंकि यह स्पष्ट करता है कि मेगा पैच के कौन से स्थान पर मैं अभी भी काम कर रहा हूं, अभी भी काम की जरूरत है।

दुर्भाग्य से, मैं एक अनट्रैक फ़ाइल के साथ ऐसा करने में सक्षम नहीं लगता। या तो मैं पूरी फाइल को स्टेज करता हूं, या कुछ भी नहीं। जो वर्कअराउंड मैं इस्तेमाल कर रहा हूं वह खाली होने पर एक नई फाइल को स्टेजिंग या यहां तक ​​कि कमिट कर रहा है, और फिर सामान्य तरीके से व्यक्तिगत बदलावों का मंचन कर रहा है। लेकिन यह समाधान एक गंदे हैक की तरह लगता है और जब मैं भूल जाता हूं, या अपना दिमाग बदल देता हूं, तो यह अधिक परेशानी पैदा करता है जितना कि होना चाहिए।

तो सवाल यह है: किसी नई फ़ाइल के केवल एक हिस्से को कैसे स्टेज किया जाए, ताकि यह नई फाइल ट्रैक हो जाए लेकिन इसके कंटेंट के पूरे या कुछ हिस्सों को न छोड़ें?

जवाबों:


415

वाह, यह सब update-indexऔर hash-objectव्यापार अत्यधिक जटिल लगता है। इसके बजाय इसके बारे में कैसे:

git add -N new_file
git add -i

से git help add:

-N, --intent-to-add
    Record only the fact that the path will be added later.  An entry
    for the path is placed in the index with no content.  This is useful
    for, among other things, showing the unstaged content of such files
    with git diff and committing them with git commit -a.

9
++ 1! उचित श्रेय। मैं थोड़ा बहुत भरोसा करता हूं कि मैं अब तक इन </shame>
मैनपेज को

1
अच्छी तरह से पाया गया। मुझे मैन पेज को थोड़ा और स्क्रॉल करना चाहिए था। शायद मुझे Git Pro बैज वापस करना चाहिए।
dave1010

3
आश्चर्य है कि क्यों git-gui इस का उपयोग आंतरिक रूप से एक नई फ़ाइल से लाइनों को सक्षम करने में सक्षम नहीं करता है।
डेविन ऑग

6
अद्भुत -Nखोज, धन्यवाद! हालाँकि मैं इसे -pउस मामले में जोड़ना पसंद करूँगा । gid add -N the_fileऔर git add -p। एक जोड़ना चाहिए कि -Nयह भी काम करता है-A
सिरिल CHAPON

@Deiwin - आप अपने ".itconfig" में "git add -N $ FILENAME" करने के लिए [guitool] जोड़ सकते हैं: [guitool "इरादे से जोड़ें"] cmd = "git add -N $ $ENENAME" needfile = yes noconsole = yes
स्टीव फ़ॉली

7

ऐसा करने का सबसे आसान तरीका (और सामान्य रूप से इंटरहो इंटरैक्टिव स्टेजिंग) है git gui। यह गिट के साथ बंडल में आता है और इसे लगभग सभी प्लेटफार्मों पर काम करना चाहिए जो गिट द्वारा समर्थित हैं।

बस चलाएं git guiऔर एक गुई खोलेगी जो ट्रैक और अनटैक की गई फ़ाइलों की स्टेजिंग और अनस्टैजिंग हॉक और यहां तक ​​कि सिंगल लाइनों की भी अनुमति देती है।

गिट गुई स्क्रीनशॉट


यह एक रचनात्मक जवाब है और कभी-कभी यह बहुत, बहुत उपयोगी है।
पाब्लो ओल्मोस डी एगुइलेरा सी।

3
बस एक नोट जिसमें सभी गिट वितरण शामिल नहीं हैं git gui। उदाहरण के लिए, डेबियन में, यह एक अलग पैकेज में है जिसे 'गिट-गुई' कहा जाता है।
क्रिस्पर

वर्षों से इस सुविधा के लिए देख रहे हैं (कठिन नहीं), यह एक जीवन परिवर्तक है
austinmarton

2
मेरे लिए अनकही फ़ाइलों की एकल लाइनों के मंचन git guiने कभी काम नहीं किया। वास्तव में, यह इन मेनू विकल्पों को अक्षम करता है
डेविन जूल

2
@Deiwin मैं वास्तव में इस सवाल में चूक गया होगा - मेरा स्क्रीनशॉट पहले से ही ट्रैक की गई फ़ाइल दिखाता है। यदि आप git guiएक नई फ़ाइल के लिए उपयोग करना चाहते हैं , तो आपको git add -N new_fileपहले दौड़ना होगा - रिचर्ड हैनसन का जवाब देखें।
क्रोनियल जूल

6
git update-index --add --cacheinfo 100644 $(git hash-object -w /dev/null) newfile
git add --interactive newfile

सरल डेमो:

mkdir /tmp/demo
cd /tmp/demo
git init .

echo hello > newfile
git update-index --add --cacheinfo 100644 $(git hash-object -w /dev/null) newfile
  • संकेत यदि आप सुनिश्चित हैं कि 'खाली' बूँद आपके git ऑब्जेक्ट डेटाबेस में पहले से मौजूद है, तो आप e69de29bb2d1d6434b8b29ae775ad8c2e48c5391इसके बजाय हैश को हार्डकोड कर सकते हैं । मैं ऐसा करने की सलाह नहीं देता
  • संकेत यदि आप विंडोज पर हैं, तो आप शायद NUL:इसके बजाय बस का उपयोग कर सकते हैं /dev/null। अन्यथा, कुछ का उपयोग करेंecho -n '' | git hash-object --stdin -w

अब सूचकांक newfileमें खाली बूँद के रूप में होगा , और खाली बूँद वस्तु डेटाबेस में दर्ज किया गया है अगर यह अभी तक मौजूद नहीं है:

$ find .git/objects/ -type f 
.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391

$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   newfile
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   newfile
#

$ git diff
diff --git a/newfile b/newfile
index e69de29..ce01362 100644
--- a/newfile
+++ b/newfile
@@ -0,0 +1 @@
+hello

यह वही होना चाहिए जो आप चाहते हैं। क्या मैं बहुत बुद्धिमान सूचकांक प्रबंधन के लिए विम भगोड़ा प्लगइन की सिफारिश कर सकता हूं (देखें बेहतर git ऐड -p? )


1
इससे काम अच्छा लगता है। मैं इसे "चरण-खाली-फ़ाइल" के रूप में याद कर रहा हूं क्योंकि यह याद रखने के लिए थोड़ा जटिल है।
dave1010

@ dave1010: खुशी है कि इसने मदद की! हाँ, मैंने एक उपनाम जोड़ने के बारे में सोचा था, लेकिन मुझे नहीं पता था कि आप उदाहरण के लिए वाइल्डकार्ड या सामान्य रूप से कई फ़ाइल नाम तर्क कैसे संभाल सकते हैं। तो मैं न करना चुना
sehe

2

संपादित करें: यह अब काम नहीं कर रहा है। मुझे यकीन है कि यह पहले था (जीआईटी 1.7.1 पर)। यदि यह काम नहीं करता है, तो मैं सुझाव देता हूं कि /dev/nullजैसा कि ऊपर बताया गया है:

git update-index --add --cacheinfo 100644 $(git hash-object -w /dev/null) newfile

यदि आप विंडोज पर हैं (बिना /dev/null) तो आप इसे खाली फाइल के पथ से बदल सकते हैं।

मूल उत्तर

तुम्हें चाहिए

git add -p # (or --patch)

यह मेरे लिए अनटैक की गई फ़ाइलों को जोड़ता है। मैन पेज से:

अनुक्रमणिका और कार्य वृक्ष के बीच अंतःक्रियात्मक पैच चुनें और उन्हें सूचकांक में जोड़ें। यह उपयोगकर्ता को सूचकांक में संशोधित सामग्री जोड़ने से पहले अंतर की समीक्षा करने का मौका देता है।

यह प्रभावी रूप से जोड़-घटाव को चलाता है, लेकिन प्रारंभिक कमांड मेनू को बायपास करता है और सीधे पैच सबकोमैंड को कूदता है। विवरण के लिए "इंटरएक्टिव मोड" देखें।


2
हालांकि दिलचस्प है, यह मेरे लिए काम नहीं करता है (git 1.7.4); git add -p newfileसब पर काम नहीं करता है (nu प्रभाव) और git add --interactive'[a] dd अनट्रैक' का प्रभाव पड़ता git add newfileहै; संपादित भी git 1.7.5.3 के साथ जाँच की; कोई पासा नहीं
12

विंडोज के लिए अच्छा संकेत, मेरे जवाब में इसके लिए संकेत जोड़े। Thx
सेह

-2

बस एक और संभावना के रिकॉर्ड के लिए: मैं उपयोग करता हूं

git add -N file
git add -p file

और फिर आप हॉक स्टेज कर सकते हैं, या उन्हें जगह में संपादित कर सकते हैं।


1
यह उत्तर स्वीकृत उत्तर के समान है, जो 2011 की तारीखों के अनुसार है। डाउवोट।
स्टैनिस्लाव पानकेविच

स्वीकृत उत्तर के add -Nसाथ जोड़ती है add -i। मैंने सिर्फ इतना जोड़ा कि काम के add -pबदले add -iभी।
पेद्रो अदमे वरगरा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.