Làm cách nào để lấy trạng thái git của một thư mục con?


81

Khi tôi thực hiện trạng thái git trong một thư mục con của kho lưu trữ của tôi, nó cũng bao gồm trạng thái của các thư mục mẹ.

Có cách nào để giới hạn git-status chỉ trong một thư mục cụ thể không?


1
không, "trạng thái git." cung cấp cho các thư mục anh chị em như ví dụ: "../sibling"
EoghanM

Bạn có phiền cung cấp thêm một chút ngữ cảnh về lý do bạn muốn lọc ra những thay đổi ở những nơi khác trong cây của bạn không? Bạn muốn sử dụng tính năng này trong những trường hợp nào?
Greg Bacon

1
Nếu có nhiều hơn một giá trị screenfull sản lượng từ bình thường "git status" lệnh
EoghanM

Câu trả lời:


100
git status .

sẽ hiển thị trạng thái của thư mục hiện tại và các thư mục con.

Ví dụ: các tệp (số) đã cho trong cây này:

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

từ thư mục con "b", git statushiển thị các tệp mới trong toàn bộ cây:

% 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
#

nhưng git status .chỉ hiển thị các tệp ở "b" trở xuống.

% 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
#

Chỉ thư mục con này, không phải bên dưới

git status .hiển thị tất cả các tệp bên dưới "b" một cách đệ quy. Để chỉ hiển thị các tệp trong "b" chứ không phải bên dưới, bạn cần chuyển danh sách chỉ các tệp (chứ không phải thư mục) tới git status. Điều này là một chút khó khăn, tùy thuộc vào vỏ của bạn.

Zsh

Trong zsh, bạn có thể chọn các tệp thông thường với "vòng loại toàn cầu" (.). Ví dụ:

% 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

Bash không có bộ định lượng toàn cầu nhưng bạn có thể sử dụng GNU findđể chọn các tệp thông thường và sau đó chuyển chúng theo git statusnhư vậy:

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

Điều này sử dụng -maxdepthlà một tiện ích mở rộng tìm GNU . POSIX tìm không có -maxdepth, nhưng bạn có thể làm điều này:

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
Xin lỗi đã mất quá nhiều thời gian để quay lại câu trả lời này - đơn giản và chính xác! Tôi tự hỏi liệu <pathspec> có được thêm vào trạng thái git sau câu hỏi của tôi không?
EoghanM

Điều gì sẽ xảy ra nếu bạn chỉ quan tâm đến thư mục hiện tại mà .đề cập đến chứ không phải các thư mục con của nó. Bất kỳ công việc xung quanh cho điều đó? Cảm ơn!
benjaminz

@benjaminz tùy thuộc vào việc sử dụng của bạn - đối với những thứ như vậy, tôi sử dụng shell globbing để chọn tệp chứ không phải thư mục con, ví dụ: (cho zsh) git status *(.). Bash không có cách viết tắt để chỉ các tệp tin, nhưng bạn có thể sử dụng một findví dụ mở rộng find . -type f -maxdepth 1 -exec git status {} +. Có vẻ như kiểu bạn muốn đặt bí danh hoặc tập lệnh hơn là gõ mọi lúc.
Matt Curtis

3

Một số lệnh hệ thống ống nước lấy một thư mục làm tham số:

git ls-files -t -o -m aDirectory

sẽ cung cấp cho bạn tất cả các tệp đã thay đổi nhưng không được cập nhật (không được thêm vào vùng) hoặc không được theo dõi. Và điều đó cho một thư mục.

Như được viết trong chủ đề này , git ls-files không hỗ trợ --addedtùy chọn ' .

lý do cơ bản hơn là vì ls-fileshệ thống ống nước là về chỉ số .
Thêm vào không phải là để so sánh giữa chỉ mục và cây công việc.
Nó nằm giữa cam kết HEAD và chỉ mục, và nó không thuộc về hệ thống ống nước ls-files.

Vì vậy, sử dụng các lệnh được đề cập ở đây :

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

sẽ cung cấp cho bạn cả tệp chưa thêm và tệp đã thêm

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

sẽ chỉ cung cấp cho bạn các tệp không được thêm vào. (trong khi phát hiện viết lại, đổi tên, bản sao, ...)

Như thường lệ với các lệnh về hệ thống ống nước, một số kịch bản theo thứ tự;)


3

Không hoàn hảo, nhưng điều này cũng hoạt động tốt từ trong thư mục bạn quan tâm:

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

Điều đó sẽ ẩn tất cả các thư mục yêu cầu tham chiếu hướng lên trong đường dẫn tương đối của chúng.

Nếu bạn muốn màu phun ra ở đầu kia, hãy đặt color.statusthành always:

git config color.status always

2
Tôi thích cách grep luôn đưa ra giải pháp tạm thời nếu bạn không biết giải pháp cụ thể hơn. Chúc mừng chương trình taco-bell.
Murftown

Đây là cách mạnh mẽ hơn!
benjaminz

2

Có thể hạn chế đối git statusvới thư mục hiện tại (không có thư mục con) bằng cách đưa ra một pathspec sử dụng từ magic glob*::

git status ':(glob)*'

Điều này hoạt động tuyệt vời! Chính xác những gì tôi đã tìm kiếm!
poindexter

1

Khi tôi thử git, tôi không tìm thấy cách nào để làm điều đó.

Tôi đã kết thúc việc:

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

Đây là phương pháp tôi đang sử dụng ... phần sau cũng nhận được tiêu đề trạng thái: git status | grep "main \ |: \ $" ... tiếc là bạn làm mất màu.
EoghanM

Đi qua câu hỏi này để tìm kiếm một trận đấu toàn cầu chung. Đây là cách dễ nhất và phù hợp với tôi, ví dụ như git status | grep extext là phần mở rộng. Cảm ơn!

0

cd YOUR_REQUIRED_DIRECTORY, sau đó,
trạng thái git.


điều này sẽ liệt kê các thư mục con nếu bạn cung cấp tùy chọn tệp không được theo dõi '-u'
poindexter
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.