कैसे बताएं कि क्या किसी फ़ाइल को ट्रैक किया गया है (शेल एग्जिट कोड द्वारा)?


357

क्या यह बताने का कोई तरीका है कि क्या किसी gitकमांड को चलाकर किसी फाइल को ट्रैक किया जा रहा है और उसका एक्जिट कोड चेक किया जा रहा है ?

दूसरे शब्दों में: git किसी फ़ाइल को ट्रैक कर रहा है?


मुझे लगता है कि बिंदु यह है कि किसी फ़ाइल को ट्रैक या अनट्रैक के रूप में तय करने के लिए क्या मानदंड है। खोज करने के लिए किसी प्रकार का ट्रैक किया हुआ फ़ाइल संग्रह होना चाहिए।
smwikipedia

जवाबों:


443

प्रयत्न:

git ls-files --error-unmatch <file name>

यदि फ़ाइल ट्रैक नहीं है तो 1 से बाहर निकल जाएगा


कम से कम मेरे पुराने (1.6.0) संस्करण के साथ, आपको त्रुटि प्राप्त करने के लिए फ़ाइल नाम से पहले--error-unmatch विकल्प डालना होगा । किसी भी तरह का विकल्प केवल उन फ़ाइलनामों पर लागू होता है जो इसका पालन करते हैं।
एलेक्स डुप्यू

दरअसल, समस्या यह प्रतीत होती है कि GNU गेटअप विकल्प को अनुमति देना सक्षम नहीं है, और एक फ़ाइल नाम (या बाद में --) के बाद प्रदर्शित होने पर --error-unmatchइसे केवल एक अन्य (सूचकांक में नहीं) फ़ाइल नाम के रूप में माना जाता है, और इसका कोई प्रभाव नहीं होता है।
एलेक्स डुप्यू

29
git ls-files | grep <PATTERN>? उदाहरण:git ls-files | grep Main.h
gaussblurinc

1
[एक भोली तरीका] फ़ाइल में एक छोटा सा बदलाव करें (एक स्थान जोड़ें / निकालें)। और देखें कि क्या 'git स्टेटस' टाइप होने पर फ़ाइल सूचीबद्ध हो रही है। एक मूर्खतापूर्ण तरीका है, लेकिन समय बचा सकता है।
BraveNinja

लेकिन मैंने इसे "git add -A- & git कमिट -m" blah "कमांड के साथ जोड़ा और प्रतिबद्ध किया। यहां तक ​​कि" git ls-tree --name-only -r sha1 "कमांड के साथ पूरी फाइलें देखें।
डॉजकी ऑक्ट

66

यदि आप त्रुटि संदेशों के साथ अपने कंसोल को अव्यवस्थित नहीं करना चाहते हैं, तो आप भी चला सकते हैं

git ls-files file_name

और फिर परिणाम की जांच करें। यदि गिट कुछ नहीं देता है, तो फ़ाइल को ट्रैक नहीं किया जाता है। यदि इसे ट्रैक किया जाता है, तो git फ़ाइल पथ को वापस कर देगा।

यह काम में आता है यदि आप इसे स्क्रिप्ट में जोड़ना चाहते हैं, उदाहरण के लिए PowerShell:

$gitResult = (git ls-files $_) | out-string
if ($gitResult.length -ne 0)
{
    ## do stuff with the tracked file
}

मुझे लगता है कि file_nameएक सटीक मिलान (पूर्ण पथ + फ़ाइल नाम) होना चाहिए, लेकिन वाइल्डकार्ड के साथ इस्तेमाल किया जा सकता है:git ls-files *foo.rb
dechimp

16

संपादित करें

यदि आपको bash से git का उपयोग करने की आवश्यकता --porcelainहै तो git statusनिम्न विकल्प है :

--चीनी मिटटी

स्क्रिप्ट के लिए एक स्थिर, आसान-से-पार्स प्रारूप में आउटपुट दें। वर्तमान में यह --short आउटपुट के समान है, लेकिन भविष्य में इसे नहीं बदलने की गारंटी है, जिससे यह स्क्रिप्ट के लिए सुरक्षित है।

आउटपुट इस तरह दिखता है:

> git status --porcelain
 M starthudson.sh
?? bla

या यदि आप एक समय में केवल एक फ़ाइल करते हैं:

> git status --porcelain bla
?? bla

मूल

करना:

git status

आप रिपोर्ट देखेंगे कि कौन सी फाइलें अपडेट की गई थीं और कौन सी नहीं हैं।

आप देख सकते हैं कि bla.shइसे ट्रैक और संशोधित किया गया है और newblaट्रैक नहीं किया गया है:

# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#
#       modified:   bla.sh
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       newbla
no changes added to commit (use "git add" and/or "git commit -a")

क्षमा करें मुझे स्पष्ट होना चाहिए था। स्थिति ठीक है, लेकिन मैं पार्स आउटपुट की तुलना में एक निकास कोड की जांच करूंगा।
डेल फोरेस्टर

git status --porcelainक्या आपका दोस्त है अगर आपको स्क्रिप्ट द्वारा आउटपुट पार्स करने की आवश्यकता है, तो लिंक पर एक नज़र
डालिए

Hihi, बहुत पुराने Git के साथ काम नहीं करता है: git status --porcelain error: unknown option चीनी मिट्टी के बरतन संस्करण 1.6.0 :-) है
Laryx Decidua

@ user465139 जो सही है ... आपको 1.7.0 git या नया (चीनी मिट्टी का विकल्प तब तक जोड़ा नहीं गया था) की आवश्यकता है।
राजमिस्त्री81

13

git statusफ़ाइल पर चलने का प्रयास करें । यदि यह git द्वारा ट्रैक नहीं किया गया है तो यह एक त्रुटि प्रिंट करेगा

PS$> git status foo.txt
error: pathspec 'foo.txt' did not match any file(s) known to git.

वाह। मैं इसे एक डायरेक्टरी पर चला रहा हूं और इसने ऐसा अभिनय किया जैसे यह पूरे रेपो की जांच कर रहा हो। धन्यवाद।
डेल फोरेस्टर

4
दरअसल, अगर मैं दौड़ता git status trackedfileहूं तो मुझे एक्ज़िट कोड 1 (उपयोगी होने की उम्मीद 0) मिलता है, लेकिन यह मुझे आउटपुट में "त्रुटि:" नहीं देता है। मैं स्ट्रिंग आउटपुट के बजाय एक निकास कोड पार्स करूंगा।
डेल फोरेस्टर

43
मुझे लगता है कि अगर मैं अपनी git वर्किंग कॉपी में मौजूद फ़ाइल पर git स्टेटस चलाऊं तो कोई त्रुटि नहीं है, लेकिन जिसे .ignignore द्वारा बाहर रखा गया है। (यानी यह जवाब नहीं करेगा।)
जेल्कैकट

कृपया ध्यान दें कि यदि फ़ाइल इग्निशन सूची में है, यानी फ़ाइल में अच्छी तरह से काम नहीं करता है.gitignore
रॉबिन ह्सू

8
यह काम नहीं करता है। यह हमेशा एक ही चीज़ को प्रिंट करता है, भले ही फ़ाइल मौजूद न हो। $ git status notthere:On branch master nothing to commit, working directory clean
च्लोए

6

मुझे ऐसे किसी git कमांड के बारे में नहीं पता है जो "खराब" निकास कोड देता है, लेकिन ऐसा लगता है कि ऐसा करने का एक आसान तरीका यह है कि यह git कमांड का उपयोग करेगा जो ट्रैक नहीं की गई फ़ाइल के लिए कोई आउटपुट देता है, जैसे कि git-log या git-ls-files। इस तरह से आपको वास्तव में कोई पार्स करने की ज़रूरत नहीं है, आप इसे एक और सरल उपयोगिता के माध्यम से चला सकते हैं जैसे grep यह देखने के लिए कि क्या कोई आउटपुट था।

उदाहरण के लिए,

git-ls-files test_file.c | जीआरपी

यदि फ़ाइल को ट्रैक किया जाता है तो एक शून्य कोड के साथ बाहर निकल जाएगा, लेकिन यदि फ़ाइल को ट्रैक नहीं किया जाता है तो किसी का निकास कोड।


3

मैं आप पर एक कस्टम उपनाम का सुझाव देता हूं .gitconfig

आपको ऐसा करना होगा:

1) git कमांड के साथ:

git config --global alias.check-file <command>

2) संपादन ~/.gitconfigऔर उपनाम रेखा पर इस लाइन को जोड़ने:

[alias]
    check-file = "!f() { if [ $# -eq 0 ]; then echo 'Filename missing!'; else tracked=$(git ls-files ${1}); if [[ -z ${tracked} ]]; then echo 'File not tracked'; else echo 'File tracked'; fi; fi;  };  f"

एक बार लॉन्च की गई कमांड (1) या सेव की गई फ़ाइल (2), अपने कार्यक्षेत्र पर आप इसका परीक्षण कर सकते हैं:

$ git check-file
$ Filename missing 

$ git check-file README.md
$ File tracked 

$ git check-file foo
$ File not tracked

2

उपयोग करने git logसे इस बारे में जानकारी मिलेगी। यदि फ़ाइल को git में ट्रैक किया जाता है तो कमांड कुछ परिणाम (लॉग) दिखाता है। और यह खाली है।

उदाहरण के लिए यदि फ़ाइल को ट्रैक किया जाता है,

root@user-ubuntu:~/project-repo-directory# git log src/../somefile.js
commit ad9180b772d5c64dcd79a6cbb9487bd2ef08cbfc
Author: User <someone@somedomain.com>
Date:   Mon Feb 20 07:45:04 2017 -0600

    fix eslint indentation errors
....
....

यदि फ़ाइल को ट्रैक नहीं किया जाता है,

root@user-ubuntu:~/project-repo-directory# git log src/../somefile.js
root@user-ubuntu:~/project-repo-directory#

1

केवल मेरे दो सेंट्स:

git ls-files | grep -x relative/path

जहाँ एक स्वत: पूर्ण शेल के भीतर relative/pathदबाकर आसानी से निर्धारित किया जा सकता है tab| wc -l 1 या 0 आउटपुट प्राप्त करने के लिए अतिरिक्त जोड़ें ।


पथ पर निर्भर करता है (जैसे कि यदि इसमें डॉट है), तो आपको grepविकल्प जोड़ना चाहिए --fixed-strings
एंडलोस स्क्लेफ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.