単一のサブフォルダーのgit-statusを取得する方法は?


84

リポジトリのサブフォルダーでgitstatusを実行すると、親フォルダーのステータスも含まれます。

git-statusを特定のフォルダーだけに制限する方法はありますか?


1
いいえ、「gitstatus」です。兄弟フォルダをたとえば「../sibling」として指定します
EoghanM 2009年

ツリーの他の場所で変更を除外する理由について、もう少しコンテキストを説明していただけませんか。この機能をどのような状況で使用しますか?
グレッグベーコン

1
通常の「
gitstatus

回答:


103
git status .

現在のディレクトリとサブディレクトリのステータスが表示されます。

たとえば、このツリー内の特定のファイル(番号)は次のとおりです。

a/1
a/2
b/3
b/4
b/c/5
b/c/6

サブディレクトリ「b」から、git statusツリー全体の新しいファイルを表示します。

% git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   ../a/1
#   new file:   ../a/2
#   new file:   3
#   new file:   4
#   new file:   c/5
#   new file:   c/6
#

ただしgit status .、「b」以下のファイルのみが表示されます。

% git status .
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   3
#   new file:   4
#   new file:   c/5
#   new file:   c/6
#

下ではなく、このサブディレクトリだけ

git status .「b」の下にあるすべてのファイルを再帰的に表示します。「b」内のファイルのみを表示し、下には表示しないようにするには、ファイルのみのリスト(ディレクトリではない)をに渡す必要がありますgit status。シェルにもよりますが、これは少し面倒です。

Zsh

zshでは、「glob修飾子」を使用して通常のファイルを選択できます(.)。例えば:

% git status *(.)
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   3
        new file:   4

バッシュ

Bashにはglob修飾子がありませんが、GNUfindを使用して通常のファイルを選択し、それらを次のgit statusように渡すことができます。

bash-3.2$ find . -type f -maxdepth 1 -exec git status {} +
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   3
        new file:   4

これ-maxdepthは、GNUfind拡張機能を使用しますPOSIX findにはがありませんが-maxdepth、これを行うことができます。

bash-3.2$ find . -path '*/*' -prune -type f -exec git status {} +
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   3
        new file:   4

2
申し訳ありませんが、この答えに戻るのにとても時間がかかりました-シンプルで正しいです!質問の後に<pathspec>がgitstatusに追加されたのだろうか?
EoghanM 2012

サブフォルダを.参照せず、参照する現在のフォルダのみに関心がある場合はどうなりますか。そのための回避策はありますか?ありがとう!
ベンジャミンズ2017年

@benjaminzは、使用方法によって異なります。たとえば、シェルグロブを使用してファイルを選択しますが、サブディレクトリは使用しません(zshの場合)git status *(.)。Bashには、ファイルのみをグロブする簡単な方法はありませんが、拡張されたfind例を使用できますfind . -type f -maxdepth 1 -exec git status {} +。いつもタイプするのではなく、エイリアスやスクリプトに入れたいようなもののようです。
マットカーティス

3

一部の配管コマンドは、パラメータとしてディレクトリを取ります。

git ls-files -t -o -m aDirectory

変更されたが更新されていない(ステージに追加されていない)、または追跡されていないすべてのファイルが表示されます。そしてそれはディレクトリです。

このスレッドで書かれているように、gitls-filesは '--addedオプションをサポートしていません。

より根本的な理由は、ls-files配管がインデックスに関するものだからです。
追加されたのは、インデックスと作業ツリーの比較ではありません
これはHEADコミットとインデックスの間にあり、ls-files配管に属していません。

したがって、ここに記載されているコマンドを使用します。

git diff-index --name-only -B -R -M -C HEAD src

追加されていないファイルと追加されたファイルの両方が表示されます

git diff-files --name-only -B -R -M -C src

追加されていないファイルのみが表示されます。(書き換え、名前変更、コピーなどを検出している間...)

配管コマンドでいつものように、いくつかのスクリプトが順番にあります;)


3

不完全ですが、これは関心のあるディレクトリ内からも機能します。

git status | grep -v ' \.\./'

これにより、相対パスで上向きの参照が必要になるすべてのディレクトリが非表示になります。

もう一方の端に色を吐き出したい場合は、次のように設定color.statusalwaysます。

git config color.status always

2
より具体的なソリューションがわからない場合、grepが常にその場しのぎのソリューションを提供する方法が大好きです。タコベルプログラミングに乾杯。
マーフタウン2011

これははるかに強力です!
ベンジャミンズ2017年

3

git status魔法の言葉glob*::を使用してpathspecを指定することにより、現在のディレクトリ(子フォルダなし)に制限することができます。

git status ':(glob)*'

これはうまくいきます!まさに私が探していたものです!
ポインデクスター

1

gitを試したとき、それを行う方法が見つかりませんでした。

私はやった:

x@x:~/x$ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       b
#       main/a
nothing added to commit but untracked files present (use "git add" to track)

x@x:~/x$ git status | grep main
#       main/a

これは私が使用していた方法です...以下もステータスの見出しを取得します:git status | grep "main \ |:\ $" ...残念ながら、色が失われます。
EoghanM 2009年

一般的なグロブの一致を探してこの質問に出くわしました。これははるかに簡単で、私にとってはうまくgit status | grep extいきます。たとえば、extが拡張子です。ありがとう!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.