ファイルが(シェル終了コードによって)Git追跡されているかどうかを確認する方法は?


357

gitコマンドを実行して終了コードをチェックすることで、ファイルが追跡されているかどうかを確認する方法はありますか?

つまり、gitはファイルを追跡していますか?


重要なのは、ファイルを追跡するか追跡しないかを決定する基準は何だと思います。検索する追跡されたファイルコレクションの種類があるはずです。
smwikipedia

回答:


443

試してください:

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

ファイルが追跡されていない場合、1で終了します


少なくとも私の古いバージョン(1.6.0)のgitでは、エラーが発生するようにファイル名の--error-unmatchオプションを付ける必要があります。どういうわけか、オプションはそれに続くファイル名にのみ適用されます。
Alex Dupuy

実際、問題はGNU getoptオプションの並べ替えが有効になっておらず、ファイル名の後に(またはの後に--)表示される場合、ファイル名--error-unmatchは別の(インデックスではない)ファイル名として扱われ、効果がないことです。
Alex Dupuy

29
git ls-files | grep <PATTERN>?例:git ls-files | grep Main.h
gaussblurinc 2013年

1
[素朴な方法]ファイルに小さな変更を加える(スペースの追加/削除)。そして、「git status」と入力したときにファイルがリストされているかどうかを確認します。ばかげた方法ですが、時間を節約できます。
BraveNinja

しかし、私は追加して何とか「-mコミット-A && gitのを追加GIT 『でそれをコミットgitのLS-ツリー--name-のみ-r SHA1『コマンド』コマンドをしてもして、全体のファイルを参照してください。』。
Dr.jacky

66

エラーメッセージがコンソールに表示されたくない場合は、次のコマンドを実行することもできます。

git ls-files file_name

そして結果を確認します。gitが何も返さない場合、ファイルは追跡されません。追跡されている場合、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

または、一度に1つのファイルのみを実行する場合:

> 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スクリプトで出力を解析する必要がある場合は、あなたの友達です。リンクされたドキュメントを参照してください。他のいくつかの便利なオプションが表示されます
stefanB

Hihi、非常に古いGitでは動作しません。git status --porcelain error: unknown option 磁器バージョンは1.6.0です:-)
Laryx Decidua 14

正しい@ user465139 ... git 1.7.0以降が必要です(それまでは磁器のオプションは追加されていませんでした)。
mason81

13

git statusファイルで実行してみてください。gitで追跡されていない場合はエラーが出力されます

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

ワオ。私はそれをディレクトリで実行している必要があり、リポジトリ全体をチェックしているように動作しました。ありがとう。
デールフォレスター、2010年

4
実際、実行するgit status trackedfileと、終了コード1(有用であると予想される0)が表示されますが、出力に「エラー:」が表示されません。文字列出力ではなく、終了コードを解析したい。
デールフォレスター

43
私のgit作業コピーには存在するが、.gitignoreによって除外されているファイルに対してgit statusを実行しても、エラーは発生しません。(
つまり、

ファイルが無視リストにある場合、つまりファイル内にある場合はうまく機能しないことに注意してください.gitignore
Robin Hsu

8
それはうまくいきません。ファイルが存在しない場合でも、常に同じものを印刷します。$ git status notthereOn branch master nothing to commit, working directory clean
Chloe

6

「悪い」終了コードを与えるgitコマンドは知りませんが、追跡されていないファイルの出力を提供しないgitコマンドを使用するのが簡単な方法のようです。 git-logまたはgit-ls-files。そうすれば、実際に構文解析を行う必要がないので、grepなどの別の単純なユーティリティを使用して実行して、出力があったかどうかを確認できます。

例えば、

git-ls-files test_file.c | grep。

ファイルが追跡されている場合は0コードで終了しますが、ファイルが追跡されていない場合は1の終了コードで終了します。


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で追跡されている場合、コマンドはいくつかの結果(ログ)を表示します。そうでなければ、それは空です。

たとえば、ファイルがgit trackedの場合、

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
....
....

ファイルがGit追跡されていない場合、

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

1

ちょうど私の2セント:

git ls-files | grep -x relative/path

オートコンプリートシェル内relative/pathを押すと、どこにあるかを簡単に判断できますtab。を追加| wc -l して、1または0の出力を取得します。


パスに応じて(たとえば、ドットが含まれている場合)、grepオプションを追加する必要があります--fixed-strings
EndlosSchleife
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.