Bagaimana saya bisa membuat git memperlihatkan daftar file yang sedang dilacak?

535

Menggunakan command line git, bagaimana saya bisa membuat git memperlihatkan daftar file yang sedang dilacak dalam repositori?

RobertL
sumber
5
mungkin duplikat file Daftar di repo git lokal?
Kristján
2
Saya percaya itu. Tapi rasanya tidak benar untuk menandai ini sebagai dup ketika ini memiliki jawaban yang lebih baik.
lindhe
5
di alam semesta paralel, sungguh aneh betapa miripnya pertanyaan ini termasuk semua jawaban, namun masing-masing dengan bakat tersendiri.
Jeff Puckett

Jawaban:

628

Jika Anda ingin membuat daftar semua file yang saat ini sedang dilacak di bawah cabang master, Anda dapat menggunakan perintah ini:

git ls-tree -r master --name-only

Jika Anda ingin daftar file yang pernah ada (yaitu termasuk file yang dihapus):

git log --pretty=format: --name-only --diff-filter=A | sort - | sed '/^$/d'
Tuxdude
sumber
61
Gunakan git ls-tree -r HEAD --name-only jika Anda ingin membuat daftar file dari cabang saat ini
Ramast
3
Mengapa direktori tidak terdaftar?
Shuzheng
13
@NicolasLykkeIversen - gittidak versi direktori secara langsung. Sebaliknya ia menyimpan file dan jalurnya. ls-treeakan menampilkan semua file yang diversi. Untuk lebih memahami perbedaan ini, coba staging direktori kosong git. Direktori kosong tidak akan pernah muncul dalam perubahan bertahap. Satu-satunya cara untuk versi direktori kosong tersebut adalah untuk benar-benar versi file di bawah direktori. Untuk kasus penggunaan di mana Anda memerlukan direktori placeholder kosong di kontrol versi, Anda bisa membuat file dummy di bawah direktori, dan versi itu. Saya harap penjelasannya jelas.
Tuxdude
2
Perhatikan saja, ls-tree masterjangan tampilkan file yang terlacak di area pementasan.
nn0p
Apakah mungkin hanya menampilkan direktori tingkat atas jika direktori tersebut berisi banyak subdirektori dan file?
Blaszard
191

File yang dikelola oleh git ditunjukkan oleh git ls-files. Lihat halaman manualnya.

vonbrand
sumber
4
Itu tampaknya hanya menampilkan file di atau di bawah direktori saat ini.
Lyle Z
11
Keberatan jika saya mengedit ini untuk memasukkan bagian yang relevan dari halaman buku panduan?
Nathan Basanese
1
@NathanBasanese mungkin Anda dapat menambahkan jawaban lain dengan informasi itu.
José Castro
@ LyleZ Mungkin ini dimaksudkan agar sesuai dengan ls... atauls -R
flow2k
1
@ LyleZ Juga, perilaku ini sama dengan git ls-tree- itu relatif terhadap pwd.
flow2k
18

Jawaban yang diterima hanya menampilkan file di pohon direktori saat ini. Untuk menampilkan semua file yang dilacak yang telah dikomit (pada cabang saat ini), gunakan

git ls-tree --full-tree --name-only -r HEAD
  • --full-tree membuat perintah dijalankan seolah-olah Anda berada di direktori root repo.
  • -rberulang ke dalam subdirektori. Dikombinasikan dengan --full-tree, ini memberi Anda semua file berkomitmen, dilacak.
  • --name-only menghapus SHA / info izin ketika Anda hanya ingin path file.
  • HEADmenentukan cabang yang Anda inginkan dari daftar file yang dilacak dan berkomitmen untuk. Anda dapat mengubah ini menjadi masteratau nama cabang lain, tetapi HEADmerupakan komit yang telah Anda periksa sekarang.

Ini adalah metode dari jawaban yang diterima hingga ~ pertanyaan rangkap https://stackoverflow.com/a/8533413/4880003 .

Nathan
sumber
Terima kasih! Ini juga berfungsi untuk repo kosong.
hzpc-joostk
5

Anda mungkin ingin keluaran berwarna dengan ini.

Saya menggunakan one-liner ini untuk membuat daftar file dan direktori yang dilacak di direktori saat ini dari cabang saat ini:

ls --group-directories-first --color=auto -d $(git ls-tree $(git branch | grep \* | cut -d " " -f2) --name-only)

Anda mungkin ingin menambahkannya sebagai alias:

alias gl='ls --group-directories-first --color=auto -d $(git ls-tree $(git branch | grep \* | cut -d " " -f2) --name-only)'

Jika Anda ingin mendaftarkan file secara rekursif:

'ls' --color=auto -d $(git ls-tree -rt $(git branch | grep \* | cut -d " " -f2) --name-only)

Dan alias:

alias glr="'ls' --color=auto -d \$(git ls-tree -rt \$(git branch | grep \\* | cut -d \" \" -f2) --name-only)"
Bloody_fool
sumber
The glralias Anda yang tersedia tampak agak aneh jadi saya membuat versi yang lebih konsisten dengan format alias pertama yang Anda berikan: alias glr='ls --color=auto -d $(git ls-tree -rt $(git branch | grep \* | cut -d " " -f2) --name-only)'. Diuji dengan git version 2.20.1pada Debian 10.
baltakatei