web-dev-qa-db-ja.com

1つのディレクトリレベルで「gitls-files」を実行する方法。

私はmsysgit(1.7.9)を使用しており、git ls-filesコマンドの正しい呼び出しを探して、インデックスまたはインデックスから、現在のレベルで(追跡された)ファイルとディレクトリのみを表示します。それが簡単な場合は、現在の作業ディレクトリ。

基本的に、Githubで表示されるのと同様のディレクトリリストが表示されます。 Windowsから来たので、グロブ(?)を行う正しい方法にあまり慣れていません。

21
Philip Oakley

私はあなたが欲しいと思いますgit ls-tree HEAD味わうためにsed'd。 ls-treeの出力の2番目のWordは、ディレクトリの場合はtree、ファイルの場合はblob、サブモジュールの場合はcommitになり、ファイル名はASCIIタブの後のすべてになります。

19
jthill

私は信じている git ls-tree --name-only [branch]あなたが探していることをします。

14
David Cain

git ls-tree <tree-ish>は問題ありませんが、index<tree-ish>として指定する方法がわかりません。 (ただし、それを行うには、すべて大文字の参照がいくつかあるはずです。)

とにかく、ls-filesは暗黙的にインデックスで機能するので、次のように使用したほうがよいでしょう。

$ git ls-files | cut -d/ -f1 | uniq

これにより、現在のディレクトリにあるファイルとディレクトリのみが表示されます。

cut-f引数を変更して深さを制御します。たとえば、-f-2(つまり、dashtwo)は、最大2レベルの深さのファイルとディレクトリを表示します。

$ git ls-files | cut -d/ -f-2 | uniq

<path>引数をls-filesに指定する場合は、先頭のディレクトリに対応するために-fを必ず増やしてください。

$ git ls-files foo/bar | cut -d/ -f-3 | uniq
5
antak

Gitによって追跡されている現在の作業ディレクトリ内のファイルを一覧表示するだけで、_git ls-tree..._を使用するよりも数倍高速であることがわかりました。

_ls | grep -f <(git ls-files)
_

次のようなディレクトリも含めたい場合は、sedを少しいじる必要があります。

_ls | grep -f <(git ls-files | sed 's/\/.*//g' | sort | uniq)  
_

ファイルの名前に「/」文字が含まれていないことを前提としています。と同様...

ls -a | grep -f <(git ls-files | sed 's/\/.*//g' | sort | uniq)

「見えない」(まだ追跡されている)ファイルもリストするため。

4
AlexJWR

これがとても難しいことに驚いています...しかし、gitについての私の把握を始めないでください。

Jthillの回答の変形は、エイリアス可能のようです(ねえ、私は言語学者です。新しい単語を作成するライセンスを持っています)。バリアントは

ls -d `git ls-tree HEAD | sed -e "s/^.*\t//"`

これは「ls」を使用して出力をフォーマットするため、色分け(使用する場合)などを取得します。これはエイリアスとしても機能します。

alias gitls='ls -d `git ls-tree HEAD | sed -e "s/^.*\t//"`'

FWIWでは、再帰コマンドのエイリアスを作成して、「ls」形式を使用することもできます(たとえば、パスとファイル名が長すぎない場合は、2列の出力、実行可能ファイルの色分けなどが得られます)。

alias gitls-r='ls `git ls-files`'
1
Mike Maxwell