Làm cách nào để thực thi lệnh Git mà không có trong kho lưu trữ?


130

Có cách nào để thực thi các lệnh Git đối với kho lưu trữ mà không nằm trong kho đó không?

Ví dụ một cái gì đó như thế này : git /home/repo log?

Xin đừng nói với tôi cdvề điều đó. Tôi đang làm điều này thông qua một execcuộc gọi.


3
Bạn có thể chỉ "cd / home / repo && git log" khi bạn thực hiện cuộc gọi không?
Alex Howansky

Tôi có một số vấn đề kỳ lạ với nó. Tôi đang bắt đầu một quy trình mới, không thực sự là một người thực hiện, nhưng tôi không biết nhiều về sự khác biệt của chúng. Tôi thấy dễ dàng hơn khi chỉ cần tìm một tham số để chỉ định thư mục git.
Tháp



1
git --git-dir = / home / repo / .git log
Atiq Ur Rehman

Câu trả lời:


101

Thử:

git --git-dir=/home/repo/.git log

Điều quan trọng là cung cấp đường dẫn đến thư mục .git của kho lưu trữ của bạn. Nếu không, bạn sẽ chỉ nhận được một thông báo lỗi có nội dung như sau:

fatal: Not a git repository

2
Tôi tiếp tục nhận được fatal: Not a git repository (or any of the parent directories): .git. @Patrick Tôi không bỏ phiếu gì cả?
Tháp

3
@Patrick Câu trả lời đã được chỉnh sửa (ban đầu --work-dirtôi nói )
Gareth

1
Điều này không làm việc cho tôi, vì nó hiển thị tất cả các tệp của cam kết đã bị xóa. Có vẻ như nó đang kiểm tra cam kết nhưng không phải nội dung thư mục. Tham khảo câu trả lời của @calandoa để có hiệu suất tốt hơn.
mxcd

2
Tôi không làm việc với tôi bằng git mới nhất, tuy nhiên sử dụng tùy chọn -C nó hoạt động, ví dụ: git -C /home/repo/.git log
D.Snap

1
điều này thực sự không hoạt động như po mong đợi. Tại sao đây là bất kỳ câu trả lời được chấp nhận? Điều này sẽ sử dụng thư mục hiện tại làm cây công việc và sử dụng .git được chỉ định cho lịch sử, điều này hoàn toàn sai. Nếu bạn không chỉ hiển thị nhật ký, ví dụ , git status. -Clà cách chính xác để đi.
Vương

218

Sử dụng -Ctùy chọn ( tài liệu ):

git -C /home/repo log

Điều này gần như tương đương --git-dir--work-treekhông có thêm .gitthư mục thông thường

Biên tập:

Trả lời bị bỏ qua ... khá tuyệt vời, vì, nói đúng ra, đây là câu trả lời đúng duy nhất cho câu hỏi. Các tùy chọn --git-dir--work-treekhông tồn tại để truy cập kho lưu trữ từ bên ngoài cây công việc, chúng được sử dụng để di chuyển .gitnơi khác và chúng phức tạp hơn nhiều để sử dụng trong một số trường hợp.

Chẳng hạn, để lấy nhật ký của /home/repo/subdirchỉ:

git -C /home/repo/subdir log .

hoặc là

git -C /home/repo log subdir

Không thể sử dụng log . với --git-dirhoặc --work-tree. Đường dẫn phải được xử lý để trích xuất đường dẫn phụ liên quan đến đỉnh của cây công việc và ngay cả trong trường hợp đó, git sẽ không nhận ra đó là đường dẫn nếu bạn không sử dụng --tùy chọn, vì vậy cách duy nhất có thể là:

git --git-dir /home/repo/.git log -- subdir

Hơn nữa, hoàn toàn --work-treekhông hoạt động với logtiểu ban với phiên bản của tôi (git 1.9.1). Nó chỉ bị bỏ qua:

git --git-dir /home/repo/.git --work-tree /home/repo/subdir log -- subdir
git --git-dir /home/repo/.git --work-tree /home/repo/whatever log -- subdir

Tôi thậm chí không hiểu đây là lỗi hay tính năng ... như thường lệ với nhiều lựa chọn thiết kế git.


Cảm ơn đã thêm lời giải thích.
Erick G. Hagstrom

git stashlà một ví dụ khác về một tiểu ban thất bại nếu --git-dir--work-treeđược sử dụng.
d5ve

4
Tùy chọn -C đã được thêm vào trong phiên bản 1.8.5 của git, được phát hành vào năm 2013.
d5ve

-C hoạt động tốt hơn --git-dir đối với tôi ... -C vinh danh cài đặt cấu hình git cho repo. Đang chạy phiên bản git 1.9.5.msysgit.1
Straff

@calandoa chúng ta luôn cần chỉ định vị trí từ gốc, một điều nữa nếu tên của repo chứa nhiều từ, làm thế nào để chúng ta nhập mã này
Kasun Siyambalapitiya

17

Trong thực tế, bạn cần sử dụng --git-dir và --work-tree cùng nhau. Đây là một ví dụ:

local [] Desktop: mkdir git
local [] Desktop: cd git
local [] git: touch README.txt
local [] git: git init
Initialized empty Git repository in /Users/albert/Desktop/git/.git/
local [] git: cd ..
local [] Desktop: git --work-tree=git --git-dir=git/.git add .
local [] Desktop: git --work-tree=git --git-dir=git/.git commit -a -m 'initial commit, called from outside the git directory'
[master (root-commit) ee951b1] initial commit, called from outside the git directory
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 README.txt
local [] Desktop: cd git
local [] git: git log --pretty=oneline
ee951b161053e0e0948f9e2a36bfbb60f9c87abe initial commit, called from outside the git di

1
Điều này đúng hơn câu trả lời chỉ với --git-dir. git-scm.com/blog/2010/04/11/envir.html
Erick G. Hagstrom

11

Tôi đã thử nhiều lần! Cuối cùng tôi đã nhận được nó!

git -C dir --no-pager log --format='%an' -1 filename

hãy nhớ, xin đừng thêm .git vào

-C dir


3

Điều này tương tự như câu trả lời của @ max. Thật không may, --git-dir đã không làm những gì tôi cần. chỉnh sửa Nhìn lại, một câu trả lời [trước] khác mà tôi chưa đọc được đề xuất sử dụng --work-tree. Tôi không chắc việc sử dụng môi trường hay cờ là phù hợp hơn nên tôi sẽ để lại câu trả lời của mình trong trường hợp ai đó tìm thấy sử dụng trong đó, nhưng tôi sẽ chuyển sang sử dụng --work-tree/ --git-dir.


Có hai repos, một bên trong cái kia nhưng không phải là mô hình con; repo bên ngoài bỏ qua nó:

tools (outer repo)
  gcc/4.9.2 (inner repo)

Những gì tôi muốn là đầu ra của git rev-parse --show-prefixliên quan đến repo bên ngoài. Đây là những gì tôi đã đưa ra (cú pháp bash; chia thành các dòng để dễ đọc):

prefix_dir=$(cd ..; git rev-parse --show-toplevel)
prefix_dir=$(GIT_WORK_TREE=${prefix_dir} git rev-parse --show-prefix)

Khi được thực hiện từ bên trong 4.9.2, nó tạo ra chuỗi gcc/4.9.2.


1

Đối với bất kỳ lệnh git, bạn có thể làm:

git --git-dir=<PATH-TO-REPO>/.git --work-tree=<PATH-TO-REPO> <git-command>

Ví dụ: nếu bạn muốn thực hiện trạng thái git:

 git --git-dir=/home/myrepo/.git --work-tree=/home/myrepo/  status

hoặc nếu bạn muốn kiểm tra chi nhánh thì repo nằm trong:

git --git-dir=/home/myrepo/.git --work-tree=/home/myrepo/  rev-parse --abbrev-ref HEAD
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.