Làm thế nào để biết nếu một tập tin được git theo dõi (bằng mã thoát shell)?


357

Có cách nào để biết một tập tin đang được theo dõi bằng cách chạy một số gitlệnh và kiểm tra mã thoát của nó không?

Nói cách khác: git theo dõi một tập tin?


Tôi nghĩ vấn đề là, tiêu chí để quyết định một tập tin là theo dõi hoặc không bị theo dõi là gì. Cần có một số loại tập hợp theo dõi để tìm kiếm.
smwikipedia

Câu trả lời:


443

thử:

git ls-files --error-unmatch <file name>

sẽ thoát với 1 nếu tệp không được theo dõi


Ít nhất là với phiên bản git cũ hơn (1.6.0) của tôi, bạn cần đặt --error-unmatchtùy chọn trước tên tệp để gặp lỗi. Bằng cách nào đó, tùy chọn chỉ được áp dụng cho tên tệp theo sau nó.
Alex Dupuy

Trên thực tế, vấn đề dường như là tùy chọn permopt GNU không được kích hoạt và khi xuất hiện sau tên tệp (hoặc sau --), --error-unmatchnó được coi như một tên tệp khác (không có trong chỉ mục) và không có hiệu lực.
Alex Dupuy

29
git ls-files | grep <PATTERN>? ví dụ:git ls-files | grep Main.h
gaussblurinc

1
[Một cách ngây thơ] Thực hiện một thay đổi nhỏ trong tệp (thêm / xóa một khoảng trắng). Và xem nếu tập tin được liệt kê khi 'trạng thái git' được gõ. Một cách ngớ ngẩn, nhưng có thể tiết kiệm thời gian.
BraveNinja

Nhưng tôi đã thêm và cam kết nó với "add git -A && git commit -m "blah git ls-cây --name chỉ sha1 -r "lệnh" lệnh Thậm chí nhìn thấy toàn bộ file với.".
Dr.jacky

66

Nếu bạn không muốn làm lộn xộn bảng điều khiển của mình với các thông báo lỗi, bạn cũng có thể chạy

git ls-files file_name

và sau đó kiểm tra kết quả. Nếu git trả về không có gì, thì tệp không được theo dõi. Nếu nó được theo dõi, git sẽ trả về đường dẫn tệp.

Điều này rất hữu ích nếu bạn muốn kết hợp nó trong một tập lệnh, ví dụ như PowerShell:

$gitResult = (git ls-files $_) | out-string
if ($gitResult.length -ne 0)
{
    ## do stuff with the tracked file
}

Tôi nghĩ rằng file_namecần phải là một kết hợp chính xác (đường dẫn đầy đủ + tên tệp), nhưng có thể được sử dụng với các ký tự đại diện:git ls-files *foo.rb
dechimp

16

BIÊN TẬP

Nếu bạn cần sử dụng git từ bash, có --porcelaintùy chọn git status:

-

Cung cấp đầu ra ở định dạng ổn định, dễ phân tích cho các tập lệnh. Hiện tại điều này giống hệt với đầu ra --short, nhưng được đảm bảo không thay đổi trong tương lai, làm cho nó an toàn cho các tập lệnh.

Đầu ra trông như thế này:

> git status --porcelain
 M starthudson.sh
?? bla

Hoặc nếu bạn chỉ làm một tệp tại một thời điểm:

> git status --porcelain bla
?? bla

NGUYÊN

làm:

git status

Bạn sẽ thấy báo cáo cho biết tập tin nào đã được cập nhật và tập tin nào không bị theo dõi.

Bạn có thể thấy bla.shđược theo dõi và sửa đổi và newblakhông được theo dõi:

# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#
#       modified:   bla.sh
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       newbla
no changes added to commit (use "git add" and/or "git commit -a")

Xin lỗi tôi nên rõ ràng hơn. Trạng thái ổn nhưng tôi muốn kiểm tra mã thoát hơn là phân tích cú pháp.
Dale Forester

git status --porcelainlà bạn của bạn nếu bạn cần phân tích đầu ra theo kịch bản, hãy xem tài liệu được liên kết, nó hiển thị một số tùy chọn hữu ích khác
stefanB

Hihi, không hoạt động với git status --porcelain error: unknown option phiên bản Git: sứ rất cũ là 1.6.0 :-)
Laryx Decidua

@ user465139 đúng ... bạn cần git 1.7.0 hoặc mới hơn (tùy chọn sứ không được thêm cho đến lúc đó).
mason81

13

Hãy thử chạy git statustrên tập tin. Nó sẽ in một lỗi nếu nó không được theo dõi bởi git

PS$> git status foo.txt
error: pathspec 'foo.txt' did not match any file(s) known to git.

Ồ Tôi phải đã chạy nó trên một thư mục và nó hoạt động như thể nó đang kiểm tra toàn bộ repo. Cảm ơn.
Dale Forester

4
Trên thực tế, nếu tôi chạy, git status trackedfiletôi nhận được mã thoát 1 (dự kiến ​​0 sẽ hữu ích) nhưng nó không cho tôi "lỗi:" trong đầu ra. Tôi muốn phân tích mã thoát hơn là đầu ra chuỗi.
Dale Forester

43
Tôi thấy rằng không có lỗi nào được nêu ra nếu tôi chạy trạng thái git trên một tệp tồn tại trong bản sao làm việc git của tôi nhưng bị loại trừ bởi .gitignore. (Tức là câu trả lời này sẽ không được thực hiện.)
JellicleCat

Xin lưu ý rằng nó không hoạt động tốt nếu tệp nằm trong danh sách bỏ qua, tức là trong tệp.gitignore
Robin Hsu

8
Điều đó không hiệu quả. Nó luôn in cùng một thứ, ngay cả khi tệp không tồn tại. $ git status notthere:On branch master nothing to commit, working directory clean
Chloe

6

Tôi không biết bất kỳ lệnh git nào cung cấp mã thoát "xấu", nhưng có vẻ như một cách dễ dàng để làm là sử dụng lệnh git không cung cấp đầu ra cho tệp không được theo dõi, chẳng hạn như git-log hoặc git-ls-files. Bằng cách đó, bạn không thực sự phải thực hiện bất kỳ phân tích cú pháp nào, bạn có thể chạy nó thông qua một tiện ích đơn giản khác như grep để xem liệu có bất kỳ đầu ra nào không.

Ví dụ,

git-ls-file test_file.c | grep.

sẽ thoát với mã 0 nếu tệp được theo dõi, nhưng mã thoát là một nếu tệp không được theo dõi.


3

Tôi đề nghị một bí danh tùy chỉnh trên bạn .gitconfig.

Bạn phải làm thế nào để làm:

1) Với lệnh git:

git config --global alias.check-file <command>

2) Chỉnh sửa ~/.gitconfigvà thêm dòng này vào phần bí danh:

[alias]
    check-file = "!f() { if [ $# -eq 0 ]; then echo 'Filename missing!'; else tracked=$(git ls-files ${1}); if [[ -z ${tracked} ]]; then echo 'File not tracked'; else echo 'File tracked'; fi; fi;  };  f"

Sau khi khởi chạy lệnh (1) hoặc tệp đã lưu (2), trên không gian làm việc của bạn, bạn có thể kiểm tra nó:

$ git check-file
$ Filename missing 

$ git check-file README.md
$ File tracked 

$ git check-file foo
$ File not tracked

2

sử dụng git logsẽ cung cấp thông tin về điều này. Nếu tệp được theo dõi trong git, lệnh sẽ hiển thị một số kết quả (nhật ký). Khác nó là trống rỗng.

Ví dụ: nếu tệp được git theo dõi,

root@user-ubuntu:~/project-repo-directory# git log src/../somefile.js
commit ad9180b772d5c64dcd79a6cbb9487bd2ef08cbfc
Author: User <someone@somedomain.com>
Date:   Mon Feb 20 07:45:04 2017 -0600

    fix eslint indentation errors
....
....

Nếu tập tin không được theo dõi git,

root@user-ubuntu:~/project-repo-directory# git log src/../somefile.js
root@user-ubuntu:~/project-repo-directory#

1

Chỉ hai xu của tôi:

git ls-files | grep -x relative/path

nơi relative/pathcó thể dễ dàng xác định bằng cách nhấn tabtrong vỏ tự động hoàn thành. Thêm một bổ sung | wc -l để có được đầu ra 1 hoặc 0.


Tùy thuộc vào đường dẫn (ví dụ: nếu nó chứa một dấu chấm), bạn nên thêm greptùy chọn --fixed-strings.
EndlosSchleife
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.