2012-05-04 8 views
15

私はmsysgit(1.7.9)を使用しています。現在のレベル、インデックス、または現在の作業のいずれかから(追跡された)ファイルとディレクトリを表示するコマンドgit ls-filesの正しい呼び出しを探していますもしそれが簡単なら、ディレクトリ。ディレクトリレベルで `ls-files`を使う方法を教えてください。

本質的に、Githubで見られるようなディレクトリリストを提供します。 Windowsからは、グッビング(?)を行う正しい方法にあまり慣れていません。

答えて

14

あなたはgit ls-tree HEAD sed'dに欲しいと思います。 LS-ツリーの出力の2番目の単語は、ASCIIタブ

+1

'git ls-files | awk -F/'{print $ 1}' |ユニーク| xargs ls -dl --color = auto' – iegik

+0

@iegikこれははるかに優れています。私はawkの代わりに 'sed、/。* ,,'を使っていました。これを答えにしてください。私はそれを恩返しするつもりです。 – jthill

+0

macOSでは動作しません - 'ls:illegal option - '。私はあなたが少なくとも、macOSで、 '... | xargs 'ls' -Gdl' - 誰かがそれがLinuxでも動作するかどうかを確認できますか? – ELLIOTTCABLE

12

あなたが探しているものはgit ls-tree --name-only [branch]と思います。

+1

ありがとうございます、その方法はそこに95%です。あなたの 'git ls-tree --name-only [branch]'は、同じリスト内のディレクトリとファイルの両方を一覧表示します(つまり、ディレクトリの末尾に '/'はありません)。 'git ls-tree -d -name-only [branch]'はディレクトリだけを一覧表示します。 「問題」の一部は、サブモジュールディレクトリを見つけることです。 –

+0

これはおそらく受け入れられる回答でしょう!それ、またはそれは1つに向かって非常に良いスタートです。 :D – ELLIOTTCABLE

+0

@PhilipOakley私は 'git ls-tree'ではなく' git ls-files'を除いて同様のことをやろうとしていました。 'git ls-files'では、同等のオプションが' --directory'であるように見えます(このコマンドで '-d'は' --deleted'の略です)。 –

3

はただのgitにより追跡され、現在の作業ディレクトリ内のファイルを一覧表示するには後にファイル名がすべてです、ディレクトリのtree、ファイルのためのblob、submodulesmためcommitになります

ls | grep -f <(git ls-files | sed 's/\/.*//g' | sort | uniq) 
:sedをしてあなたもの線に沿って、ディレクトリ、何かを含めるしたい場合

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

それはいじり少しかかるだろう:私は、次のようにgit ls-tree...を使用するよりも数倍高速であることがわかりました

あなたのファイルの名前に「/」文字がないものと仮定します。など...

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

も ​​"見えない"(未-追跡)ファイルをリストするためです。

+0

これはいいです...なぜ私は '[別名]'として追加できないのでしょうか? grep -f <(git ls-files | sedの///.*// g 'sort | uniq);}; f "' - > 'fatal:' 'ls-tracked = bad config file' –

4

git ls-tree <tree-ish>が良いと、すべてのですが、私は<tree-ish>としてインデックスを指定する方法を見つけ出すことはできません。 (私は確信しているが、いくつかは、すべて大文字はちょうどそれを行うために参照があるようにバインドされています)

とにかく、ls-filesは暗黙のうちに私は同様にその使用することがありますインデックスに動作します:

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

このショーをファイルとディレクトリは現在のディレクトリにのみ存在します。

cut-f引数を制御深度に変更します。あなたが主要なディレクトリに対応するために-fを増加することを確認し、ls-files<path>引数を指定した場合

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

を例えば、 -f-2(つまり ダッシュ 2です)の深い二つのレベルまでのファイルとディレクトリを示してい
$ git ls-files foo/bar | cut -d/ -f-3 | uniq 
+0

['git write-tree'](https://git-scm.com/docs/git-write-tree)でインデックスのツリーを取得できます。 – jthill

0

私はこれがとても難しいことに驚いています...しかし、私はgitについての私の欲求を始めません。

jthillの回答の変形はエイリアス可能です(ちょっと、私は言語学者です、私は新しい言葉を作るためのライセンスを持っています)。、

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

FWIW:バリアントは、それはまた、別名として働くなど、(あなたがいることを使用する場合)は、カラーコードを取得するので、これは、「1!」の出力をフォーマットするために使用しています

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

です再帰的なコマンドをエイリアスすることもできるので、 'ls'フォーマットを使用することができます(パス+ファイル名が長すぎない場合、2つのカラム出力、実行可能ファイルの色分けなど)

alias gitls-r='ls `git ls-files`' 
関連する問題