क्या एक विशिष्ट रेखा को अनदेखा कर सकते हैं?


114

मैं फोन के देशी ब्राउज़र पर परीक्षण करते समय फोनगैप के साथ सिंक करने के लिए git का उपयोग कर रहा हूं। जैसे कि मेरे पास निम्न पंक्ति है:

var isPhoneGap = false;

स्पष्ट रूप से मैं इसे बदलते समय निर्माण करता हूं, लेकिन क्या कोई तरीका है कि मैं इस एक पंक्ति को अनदेखा करने के लिए गिट स्थापित कर सकता हूं या क्या मुझे इसे अपनी फ़ाइल में रखना होगा और इसे इस तरह से अनदेखा करना होगा?

मैं Gitx और OSX 10.6 पर टर्मिनल का उपयोग कर रहा हूं।


@ user494461: Git फिल्टर जिस तरह से यह करने के लिए है: stackoverflow.com/a/16244970/520162
Eckes

1
क्या आप एनवायरमेंट का पता नहीं लगा सकते हैं और एनरॉयमेंट कॉन्फिग फाइल का इस्तेमाल कर सकते हैं?
एक्ससुम

संक्षेप में: नहीं। लेकिन मैंने एक प्रीप्रोसेसर स्क्रिप्ट लिखी है, जो निश्चित टिप्पणी कोड की तलाश करती है और प्रकाशन से पहले इसे हटा देती है। : इसे बाहर की जाँच करें यहाँ github.com/franklinchou/ahk_config/blob/master/preprocess.sh
फ्रेंकलिन

जवाबों:


103

यदि आपकी फ़ाइल एक विशिष्ट प्रकार की है, तो आप एक सामग्री फ़िल्टर ड्राइवर की घोषणा कर सकते हैं , जिसे आप एक .gitattributesफ़ाइल में घोषित कर सकते हैं (जैसा कि " Git Attributes " के "कीवर्ड विस्तार" में प्रस्तुत किया गया है ):

http://git-scm.com/figures/18333fig0702-tn.png

*.yourType filter=yourFilterName

( यदि आप चाहें तो उस फ़िल्टर को किसी विशिष्ट फ़ाइल के लिए भी सेट कर सकते हैं)

लागू:

  • yourFilterName.smudge(ट्रिगर किया गया git checkout) और

    git config --global filter.yourFilterName.smudge 'sed "s/isPhoneGap = .*/isPhoneGap = true/"'
    
  • yourFilterName.clean(ट्रिगर किया गया git add)

    git config --global filter.yourFilterName.clean 'sed "s/isPhoneGap = .*/isPhoneGap = false/"'
    

आपकी फ़ाइल अपरिवर्तित दिखाई देगी git status, फिर भी इसके चेक आउट संस्करण के लिए सही मान होगा isPhoneGap


1
इसके लिए धन्यवाद। यह काम कर रहा है। क्या आप जानते हैं कि git diff or git स्टेटस कैसे बनाया जाता है, हालांकि फ़िल्टर को अनदेखा करें? इसलिए मैं अभी भी देख सकता हूं कि क्या अलग है? मेरा उपयोग मामला डिबग लॉग के लिए है ... जिसे अंततः मैं हटाना चाहता हूं ... @jthill @VonC
timh

1
@timh यदि फ़िल्टर काम कर रहा है, तो git स्टेटस या git diff कुछ भी नहीं दिखाना चाहिए।
वॉन

1
यह अफ़सोस की बात है कि GIT में कोई सरल तरीका नहीं है। git उपेक्षा <फ़ाइल नाम> <linenumber> इतना आसान होगा!
kiedysktos

22
@kiedysktos लिनेनंबर? अगर लाइन नंबर बदल जाए तो क्या होगा?
VonC

इसने बहुत अच्छा काम किया, लेकिन विंडोज यूजर्स सावधान रहें, gitconfig बहुत ही अचूक है कि यह किन पात्रों को पकड़ना चाहता है, इसलिए कुछ अर्ध-विदेशी नियमित अभिव्यक्तियों को आज़माते समय आप परेशानी में पड़ सकते हैं। मैंने अपने सेड-कॉल्स को एक अलग हेल्पर.श फ़ाइल में डाल दिया, जिसे मैंने अपने gitconfig से कॉल किया, ताकि sh ".git/helper.sh"किसी भी पैरामीटर से गुजरने के लिए सुनिश्चित कर सकूं कि मैं सेड करूं "$@"(मुझे लगता है कि सिर्फ फ़ाइलपैथ पास हुआ है)।
ohaal

43

आप उपयोग कर सकते हैं

git update-index --assume-unchanged [file]

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

जब फ़ाइल में परिवर्तन होते हैं जो आपके लिए महत्वपूर्ण होते हैं:

git update-index --no-assume-unchanged [file]

इसके अलावा, Git doc अपडेट-इंडेक्स को देखें--[no-]assume-unchanged पैरामीटर के ।

जब ये फ़्लैग निर्दिष्ट किए जाते हैं, तो पथों के लिए रिकॉर्ड किए गए ऑब्जेक्ट नाम अपडेट नहीं किए जाते हैं। इसके बजाय, ये विकल्प निर्धारित करते हैं और रास्तों के लिए "अपरिवर्तित मान" को परेशान करते हैं। जब "मान अपरिवर्तित" बिट चालू होता है, तो git संभावित संशोधनों के लिए कार्यशील ट्री फ़ाइलों की जाँच करना बंद कर देता है, इसलिए आपको कार्य ट्री फ़ाइल को बदलते समय गिट को बताने के लिए मैन्युअल रूप से परेशान करने की आवश्यकता होती है।


2
जब मैं गिट पुल करूँगा तब क्या यह नया संस्करण लाएगा?
साद रहमान शाह

1
@ कैफीन जब आप गिट पुल करते हैं तो आपको अंतिम संस्करण मिलता है जो कि शुरू किया गया था, यह फाइल - '' एंसोम-अपरिवर्तित '' को बदलने से पहले अंतिम होगा।
कार्लोस

1
मेरा मानना --skip-worktreeहै कि अधिकांश उद्देश्यों के लिए एक बेहतर विकल्प है। stackoverflow.com/a/39583010/4233593
जेफ पकेट


3
यह पूरी फाइल के अपडेट को नजरअंदाज नहीं करता है, विशिष्ट पंक्ति नहीं है
nikoss

6

Gitx को आपको व्यक्तिगत लाइनों को कम करने या अनदेखा करने देना चाहिए (आप पहले से ही जानते होंगे), लेकिन आपको हर बार ऐसा करना होगा। मुझे लगता है कि तैनाती के लक्ष्य के अनुसार एक कॉन्फिगर फाइल करना बेहतर होगा (आप उन लोगों को संस्करण दे सकते हैं), और कुछ रनटाइम पैरामीटर हालांकि आप सर्वर (जैसे ./myserver --config=whatever.js) शुरू कर रहे हैं ।


5

निरंतर https://stackoverflow.com/a/20574486/4935114 , @ माइक ने एक pre-commitहुक बनाने का प्रस्ताव रखा जो grepलाइनों के लिए मंचित फाइलों में होगा जिसे कोई अनदेखा करना चाहता है। हुक जाँचता है कि क्या उन लाइनों का मंचन किया गया था। यदि ऐसा है, तो यह echoचेतावनी है और यह exitकोड के साथ है 1इसलिए प्रतिबद्ध प्रक्रिया जारी नहीं रहेगी।

@ माइक के जवाब से प्रेरित होकर , मैंने खुद को उसके हुक के बेहतर संस्करण का उपयोग करते हुए पाया, जो स्वचालित रूप से reset ( -pध्वज के साथ ) विशिष्ट रेखा है जिसे हम अनदेखा करना चाहते हैं।

मुझे यकीन नहीं है कि यह हुक एक ऐसी स्थिति के लिए काम करेगा, जहां आपके पास इस लाइन के साथ कई फाइलें नजरअंदाज करने के लिए हैं, लेकिन यह pre-commitहुक एक विशिष्ट फ़ाइल में इस पंक्ति में एक बदलाव के लिए दिखता है buildVars.java। हुक स्क्रिप्ट इस तरह दिखी जब मैंने अपनी मशीन पर इसका परीक्षण किया।

#!/bin/sh

# this hook looks for lines with the text `var isPhoneGap = false;` in the file `buildVars.java` and it resets these lines to the previous state before staged with `reset -p`

if [[ $(git diff --no-ext-diff --cached buildVars.java | grep --count -e "var\ isPhoneGap[\ ]*=[\ ]*") -ne 0 ]]; then
    cat <<EOW
WARNING: You are attempting to commit changes which are not supposed to be commited according to this \`pre-commit\` hook
This \`pre-commit\` hook will reset all the files containing this line to it's previous state in the last commit.
EOW
    echo /$'\n'isPhoneGap$'\n'y$'\n'q | git reset -p
    # BONUS: Check if after reseting, there is no actual changes to be commited and if so, exit 1 so the commit process will abort.
    if [[ $(git diff --no-ext-diff --cached | wc -l) -eq 0 ]]; then
        echo there are no actual changes to be commited and besides the change to the variable \'isPhoneGap\' so I won\'t commit.
        exit 1
    fi
fi

व्याख्या

मैंने जो किया वह एक नियंत्रण दृश्यों की गूंज थी जो isPhoneGapएक इंटरैक्टिव resetप्रक्रिया के दौरान रेगेक्स की खोज करता है। इस प्रकार एक उपयोगकर्ता का अनुकरण करना जो /खोज करने के लिए isPhoneGapदबाता है y, यह पूछने पर दबाता है कि क्या वह इस पैच को छोड़ना चाहता है और अंत qमें इंटरएक्टिव से बाहर निकलने के लिए दबाता है reset

इंटरैक्टिव उलट पैच प्रक्रिया यहाँ प्रलेखित है: https://git-scm.com/docs/git-add#git-add-patch


नोट: उपरोक्त स्क्रिप्ट यह मानते हुए कि चर interactive.singleKeyहै false। आप के लिए तुम्हारा कॉन्फ़िगर किया गया हैं true, किसी भी हटाने $'\n'से echoसही चेतावनी के बाद आदेश।


3

यह है कि आप इसे git फ़िल्टर के साथ कैसे कर सकते हैं :

  1. फ़ाइल बनाएँ / खोलें gitattributes:
    • <प्रोजेक्ट रूट> /। gitattributes (रेपो में प्रतिबद्ध होगा)
      या
    • <प्रोजेक्ट रूट> /? git / जानकारी / विशेषताएँ (रेपो में प्रतिबद्ध नहीं होंगी)
  2. फ़िल्टर की जाने वाली फ़ाइलों को परिभाषित करने वाली एक पंक्ति जोड़ें:
    • *.rb filter=gitignore, अर्थात् gitignoreसभी *.rbफाइलों पर नाम से फ़िल्टर चलाएं
  3. gitignoreअपने में फ़िल्टर को परिभाषित करें gitconfig:
    • $ git config --global filter.gitignore.clean "sed '/#gitignore$/'d", यानी इन लाइनों को हटा दें
    • $ git config --global filter.gitignore.smudge cat, यानी रेपो से फाइल खींचते समय कुछ न करें

नोट:
बेशक, यह माणिक फ़ाइलों के लिए है, जब एक लाइन #gitignoreदुनिया भर में लागू होती है , तब लागू होती है ~/.gitconfig। इसे संशोधित करें लेकिन आपको अपने उद्देश्यों की आवश्यकता है।

चेतावनी !!
यह आपकी कार्यशील फ़ाइल को रेपो (निश्चित रूप से) से अलग करता है। किसी भी जाँच या रिबासिंग का अर्थ होगा कि ये रेखाएँ खो जाएँगी! यह ट्रिक बेकार लग सकती है क्योंकि ये लाइनें बार-बार चेक आउट, रिबेस या पुल पर खो जाती हैं, लेकिन इसका उपयोग करने के लिए मेरे पास एक विशिष्ट उपयोग का मामला है।

बस git stash save "proj1-debug" जबकि फ़िल्टर निष्क्रिय है (बस अस्थायी रूप से gitconfigया कुछ में इसे अक्षम करें )। इस तरह, मेरा डिबग कोड git stash applyकभी भी इन लाइनों के डर के बिना कभी भी गलती से प्रतिबद्ध होने पर किसी भी समय मेरे कोड के लिए 'घ' हो सकता है ।

इन समस्याओं से निपटने के लिए मेरे पास एक संभावित विचार है, लेकिन मैं इसे कुछ समय के लिए लागू करने की कोशिश करूंगा।

Git फिल्टर्स और gitattributes का उल्लेख करने के लिए रुडी और jw013 को धन्यवाद।


2

एक कंटेंट फिल्टर ड्राइवर एक अच्छा समाधान नहीं है। आप इस पंक्ति को git status/ आदि से छिपाने में सक्षम हो सकते हैं लेकिन इसे वास्तव में अनदेखा नहीं किया जा रहा है। जैसे ही आप मूल्य बदलते हैं, आपकी कार्यशील निर्देशिका को भले ही न दिखाई दे, भले ही वह गंदा दिखाई दे।

यदि आप वास्तव में इस लाइन को संस्करण नियंत्रण से बाहर करना चाहते हैं, तो इसे कमांड लाइन तर्क में बदलना या इसे अनदेखा शामिल करना या फ़ाइल बनाना एकमात्र व्यावहारिक साधन हो सकता है।


"जैसे ही आप मूल्य बदलते हैं, आपकी कार्यशील निर्देशिका को भले ही परिवर्तन दिखाई न दे रहा हो, गंदा लिखा जाएगा": यह नहीं होना चाहिए, यदि स्वच्छ स्क्रिप्ट अभी भी अपनी मूल सामग्री में फ़ाइल को पुनर्स्थापित करती है।
वॉनसी

यही मैंने सोचा था। मैं GitExtensions का उपयोग कर रहा हूं और यह फाइल को संशोधित रूप में दिखाएगा यहां तक ​​कि अंतर फलक रिक्त है। संभवत: क्योंकि क्लीन फ़िल्टर फ़ाइल चेक-इन तक नहीं चलता है। संभवतः क्योंकि यह एमएसइज़िट है, न कि गिट-गिट। IDK, YMMV
patricktokeeffe

1

मैं अनुमान लगा रहा हूं कि यह कुछ ऐसा हो सकता है जो आपके स्रोत की एक से अधिक पंक्ति में आता है।

मुझे लगता है कि यह किसी प्रकार की .userbuildconfig फ़ाइल है, जिसे आपने अभी शामिल किया है और इसमें जाँच की गई चूक है, तो सबसे साफ होगा। फिर आप कार्लोस के सुझाव का उपयोग करके उस फ़ाइल को अकेले अपरिवर्तित मान सकते हैं। इस तरह से फ़ाइल में अन्य परिवर्तन जहाँ आपको सेटिंग की जाँच करने की आवश्यकता नहीं है याद नहीं है।

यह आपको स्थानीय रूप से प्रीप्रोसेसर मैक्रोज़ को ट्यून करने की अनुमति दे सकता है (या जावा के लिए कुछ इस तरह https://stackoverflow.com/a/1813873/1270965 )।


-1

नहीं। आप केवल व्यक्तिगत फ़ाइलों (और अधिक) को अनदेखा कर सकते हैं क्योंकि .ignignore में लाइनें फ़ाइल नामों से मेल खाती हैं और फ़ाइल सामग्री नहीं। आप इसका समाधान पहले ही बता चुके हैं, अर्थात एक भी फाइल को अनदेखा करें जिसमें वह सामग्री हो जिसे आप अनदेखा करना चाहते हैं।


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