git: सभी उपस्थित फ़ाइलों को कैसे अनदेखा करें?


131

वहाँ एक आसान तरीका है एक जीआईटी रिपॉजिटरी में सभी अनट्रैक की गई फ़ाइलों और फ़ोल्डरों को अनदेखा करना है?
(मैं इसके बारे में जानता हूं .gitignore।)

तो git statusफिर से एक साफ परिणाम प्रदान करेगा।



या आप अपनी .gitignore फ़ाइल में एकल * जोड़ना चाहते हैं। :)
vilicvane

1
बस एक *बहुत संभावना नहीं है कि आप क्या चाहते हैं।
sjas


इतने गलत उत्तरों पर हैरानी। -u noगलत है। -unoसही है। -u noनामक फाइल पर स्टेटस करने की कोशिश करता है no! noहै नहीं करने के लिए एक तर्क -unoएक तर्क के रूप में व्याख्या करने के लिए मजबूर करने के लिए -u, कोई स्थान नहीं होना चाहिए। इस परीक्षण के लिए करते हैं touch Invalidऔर तुलना git status -uInvalidकरने के लिए git status -u Invalid
एरोन मैकडैड

जवाबों:


251

जैसा कि पहले ही कहा गया है, स्थिति से बाहर निकालने के लिए बस उपयोग करें:

git status -uno  # must be "-uno" , not "-u no"

यदि आप इसके बजाय अपनी परियोजना के मूल से, वर्तमान में अनियोजित फ़ाइलों को स्थायी रूप से अनदेखा करना चाहते हैं, तो लॉन्च करें:

git status --porcelain | grep '^??' | cut -c4- >> .gitignore

प्रत्येक बाद की कॉल git statusस्पष्ट रूप से उन फ़ाइलों को अनदेखा करेगी।

अद्यतन : उपरोक्त आदेश में एक छोटी सी खामी है: यदि आपके पास .gitignoreअभी तक कोई फ़ाइल नहीं है तो आपका gitignore खुद को अनदेखा कर देगा! ऐसा इसलिए होता है क्योंकि फ़ाइल निष्पादित .gitignoreहोने से पहले बनाई जाती git status --porcelainहै। इसलिए यदि आपके पास कोई .gitignoreफ़ाइल नहीं है, तो मैं इसका उपयोग करने की सलाह देता हूं:

echo "$(git status --porcelain | grep '^??' | cut -c4-)" > .gitignore

यह एक subshell जो पूरा करता है बनाता है से पहले.gitignore फ़ाइल बनाई गई है।

COMMAND व्याख्या के रूप में मैं वोट का एक बहुत हो रही है (धन्यवाद!) मुझे लगता है कि मैं बेहतर आदेश थोड़ा समझाने चाहते हैं:

  • git status --porcelainइसके बजाय इसका उपयोग किया जाता है git status --shortक्योंकि मैनुअल में कहा गया है "स्क्रिप्ट के लिए आउटपुट को एक आसान-से-पार्स फॉर्मेट में दें। यह शॉर्ट आउटपुट के समान है, लेकिन गिट संस्करणों में स्थिर रहेगा और उपयोगकर्ता कॉन्फ़िगरेशन की परवाह किए बिना।" इसलिए हमारे पास पारगम्यता और स्थिरता दोनों हैं;
  • grep '^??'केवल उन रेखाओं को फ़िल्टर करता है ??, जो गिट स्टेटस मैनुअल के अनुसार अनट्रैक की गई फ़ाइलों के अनुरूप होती हैं;
  • cut -c4- हर पंक्ति के पहले 3 वर्णों को हटा देता है, जो हमें अनट्रैक फ़ाइल के सापेक्ष पथ देता है;
  • |प्रतीक हैं पाइप , जो निम्न आदेश के इनपुट के लिए पिछला आदेश के उत्पादन में पारित;
  • >>और >प्रतीक हैं रीडायरेक्ट ऑपरेटरों , जो एक फ़ाइल या अधिलेखित करने के लिए पिछले आदेश के उत्पादन में संलग्न / क्रमशः एक नई फ़ाइल बनाता है,।

एक और प्रकार जो लोग पसंद करते हैं के लिए का उपयोग करsed के बजाय grepऔर cut, यहाँ एक और तरीका है:

git status --porcelain | sed -n -e 's/^?? //p' >> .gitignore

3
cut -c4- हर पंक्ति के पहले 4 वर्णों को हटा देता है, जो हमें अनट्रैक फ़ाइल के सापेक्ष पथ देता है; सं -c। कट करने के लिए कॉलम संख्याओं की सूची की शुरुआत। और कॉलम 4 से अंत तक लाइन 4- का चयन करता है, जो कॉलम 1-3 को काटता है। तो आपका कट कमांड वास्तव में प्रत्येक पंक्ति के पहले 3 वर्णों को हटा देता है। यदि आपने एक git स्टेटस लाइन से 4 अक्षर निकाले हैं जैसे कि इस फाइल के लिए यहाँ:, ?? app/views/static_pages/contact.html.erbआप पहले अक्षर को हटा देंगे app। तो कमांड सही है, लेकिन स्पष्टीकरण दोषपूर्ण है।
7stud

@ 7stud: धन्यवाद, आप सही हैं, मैंने गलती से 4 लिखा है। मैंने जवाब तय कर दिया है।
डिएगो

2
मैं वास्तव में कमांड स्पष्टीकरण की सराहना करता हूं। यह जानकर अच्छा लगा कि इंटरनेट से कॉपी किए गए रैंडम कमांड्स क्या कर रहे हैं, और हम सभी को यह सीखने में मदद करते हैं कि कमांड लाइन का उपयोग कैसे करें और बेहतर तरीके से कैसे करें।
एरिक फिटिंग

1
-u noमेरे लिए काम नहीं करता है। लेकिन -unoकरता है। मैंने उसी हिसाब से जवाब अपडेट किया है। यह गिट के लिए अजीब डिजाइन है। मैं git 1.7.1 पर हूँ
एरॉन मैकडैड

2
@AaronMcDaid: धन्यवाद। परिवर्तन यहाँ प्रलेखित है , और यहाँ
डिएगो

51

यदि आप इन फ़ाइलों को स्थायी रूप से अनदेखा करना चाहते हैं, तो उन्हें जोड़ने का एक सरल तरीका .gitignoreहै:

  1. गिट पेड़ की जड़ में बदलें।
  2. git ls-files --others --exclude-standard >> .gitignore

यह अनक्रेक्टेड डायरेक्ट्रीज़ के अंदर सभी फाइलों को एन्यूमरेट करेगा, जो आप चाहते हैं या नहीं हो सकता है।


3
इसे इतने वोट क्यों नहीं मिलते? 2 अन्य कार्यक्रमों के माध्यम से पाइप करने की आवश्यकता नहीं है!
जोएलफैन

4
@JoelFan: दो कारण: 1) यह केवल गिट की जड़ से काम करता है , जबकि स्वीकृत प्रत्येक उपनिर्देशिका में से एक काम करता है, आपको बस गंतव्य .gitignoreपथ 2 को मोड़ने की आवश्यकता है ) यदि आपके पास एक अनएकेडेड निर्देशिका है, तो यह प्रत्येक सूची में से एक है। इसमें हर एक फ़ाइल, लेकिन स्वयं अनट्रैकड डायरेक्टरी नहीं (इसलिए आप डायरेक्ट्री को नजरअंदाज नहीं करेंगे, और इस तरह अभी भी डायरेक्टरी में भविष्य की फाइल को अनट्रैक के रूप में प्राप्त कर सकते हैं, जबकि स्वीकृत केवल लिस्ट को डायरेक्ट्री नहीं करता है, और न ही अनट्रैक फाइल्स को। यह आप क्या करना चाहते हैं की एक बात है, लेकिन अक्सर आप पूरी डायर को नजरअंदाज करना चाहते हैं
डिएगो

1
शुक्र है कि मैं आपके सुझाव के अंतर की सराहना करता हूं क्योंकि @Diego द्वारा बताए गए बिंदुओं के कारण मैंने फाइलों और फ़ोल्डरों की लाइब्रेरी के साथ काम करना शुरू कर दिया है और मैं मूल फाइलों को ट्रैक / पुश नहीं करना चाहता हूं। मैं केवल उन फ़ाइलों को ट्रैक करना चाहता हूं जो मैं लाइब्रेरी में जोड़ता हूं या पुनर्निर्माण करता हूं। मूल फ़ोल्डर जोड़ने से सब कुछ अनदेखा हो जाएगा। इस / आपके समाधान ने एक तस्वीर में सभी 1696 फाइलें जोड़ीं। xD
Chaos7703

इसका उपयोग करके भी प्राप्त किया जा सकता है git config status.showUntrackedFiles no
लार्च

16

इसे नियमावली में मिला

मोड पैरामीटर का उपयोग अनट्रैक फ़ाइलों की हैंडलिंग को निर्दिष्ट करने के लिए किया जाता है। यह वैकल्पिक है: यह सभी के लिए डिफ़ॉल्ट है, और यदि निर्दिष्ट किया गया है, तो इसे विकल्प (जैसे -uno, लेकिन नहीं-नहीं) से चिपका होना चाहिए।

git status -uno


39
ठीक है, अगर हर कोई पोस्ट करने से पहले RTFM करेगा, तो हम में से कोई भी कभी भी प्रतिनिधि नहीं होगा :-)
जेनी डी

4

दो तरीके:

"-uno" तर्क-स्थिति का उपयोग करें। यहाँ एक उदाहरण है:

[jenny@jenny_vmware:ft]$ git status
# On branch ft
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       foo
nothing added to commit but untracked files present (use "git add" to track)
[jenny@jenny_vmware:ft]$ git status -uno
# On branch ft
nothing to commit (working directory clean)

या आप फ़ाइलों और डायरेक्टर्स को .gitignore में जोड़ सकते हैं, जिस स्थिति में वे कभी नहीं दिखाएंगे।


2
.gitignoreजा रहा है संपादन का एक आसान तरीका है git status | cat >> temp && vim temp। फिर फ़ाइल को संपादित करना इसलिए पहली कुछ पंक्तियाँ और अंतिम पंक्ति हटा दी जाती है, साथ ही पीछे #और उसके बाद व्हाट्सएप। तब cat temp >> .gitignore && rm temp। मामले में .gitignoreपहले मौजूद नहीं था, mv temp .gitignoreकरेंगे। बदसूरत सामान लेकिन .gitignoreमैन्युअल रूप से अपडेट करने से बेहतर है ।
साजास

1
यह उत्तर गलत है। सही जवाब है -uno। यदि आप उपयोग करते हैं -u no, तो यह समतुल्य है no -u- यह एक फाइल पर एक स्टेटस करेगा, जिसे कहा जाता है no(जो संभवतः मौजूद नहीं है) और डिफ़ॉल्ट -uमोड का उपयोग करें। यानी यह बराबर हैgit status no
एरॉन मैकडैड

3

-u noअस्थिर फ़ाइलों को भी नहीं दिखाता है। -unoवांछित के रूप में काम करता है और अस्थिर दिखाता है, लेकिन बिना टूटे छुपाता है।


1
यहां तक ​​कि यह काफी सही नहीं है। git status -u Xके बराबर है git status X -u( Xएक तर्क नहीं है -u)। यह, बदले में, के बराबर है git status X(क्योंकि -uबिना तर्क डिफ़ॉल्ट है -u)। इसलिए, यह केवल फ़ाइल पर एक git-status है X। तो, अगर Xहै noयह बस नामक एक फ़ाइल पर एक Git स्थिति करने की कोशिश करता noहै, जो आप शायद नहीं है
हारून McDaid

2

यदि आप OS की तरह यूनिक्स पर नहीं हैं , तो यह विंडोज पर PowerShell का उपयोग करके काम करेगा

git status --porcelain | ?{ $_ -match "^\?\? " }| %{$_ -replace "^\?\? ",""} | Add-Content .\.gitignore

हालाँकि, .gitignoreफ़ाइल में एक नई खाली पंक्ति होनी चाहिए, अन्यथा यह सामग्री होने पर अंतिम पंक्ति में पाठ को जोड़ देगा।

यह एक बेहतर विकल्प हो सकता है:

$gi=gc .\.gitignore;$res=git status --porcelain|?{ $_ -match "^\?\? " }|%{ $_ -replace "^\?\? ", "" }; $res=$gi+$res; $res | Out-File .\.gitignore


1

यदि आपके पास बहुत सारी अनटैक की गई फाइलें हैं, और gitignoreउन सभी को " " नहीं करना चाहते हैं, तो ध्यान दें कि, git 1.8.3 (अप्रैल, 22d 2013) के बाद से , उस विकल्प का git statusउल्लेख नहीं करेंगे, --untracked-files=noभले ही आपने वह विकल्प नहीं जोड़ा हो पहले स्थान पर!

" git status" उपयोगकर्ताओं को सुझाव देता है कि वे --untracked=noविकल्प का उपयोग करने पर ध्यान दें जब यह बहुत लंबा हो।


0

मैं यहां थोड़ी अलग समस्या को हल करने की कोशिश कर रहा था। शायद यह किसी और के लिए उपयोगी होगा:

मैं एक नई शाखा बनाता हूं feature-a। इस शाखा के भाग के रूप में मैं नई निर्देशिकाएँ बनाता हूँ और उनमें से कुछ को दबाने के लिए .gitignore को संशोधित करने की आवश्यकता है। विभिन्न कैश फ़ोल्डर बनाने वाले प्रोजेक्ट में नए टूल जोड़ने पर यह बहुत होता है। .serverless, .terraformइत्यादि।

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

यहाँ उत्तर वास्तव में सरल है, हालांकि मुझे यह पता लगाने के लिए इस ब्लॉग को खोजना पड़ा :

बस feature-aशाखा से .gitignore फ़ाइल चेकआउट करें

git checkout feature-a -- feature-a/.gitignore
git add .
git commit -m "update .gitignore from feature-a branch"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.