2011-08-22 22 views
35

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

Ví dụ như sau: git /home/repo log?

Vui lòng không cho tôi biết cd. Tôi đang thực hiện việc này thông qua cuộc gọi exec.

+0

Không thể bạn chỉ là "cd/home/repo && git log" như exec của bạn gọi? –

+0

Tôi có một số vấn đề lạ với nó. Tôi đang bắt đầu một quá trình mới, không thực sự là một exec, nhưng tôi không biết làm thế nào họ khác nhau mặc dù. Tôi thấy dễ dàng hơn khi chỉ tìm một tham số để chỉ định thư mục git. – Tower

+1

có thể trùng lặp của [Tôi có thể thực hiện các hoạt động git (thêm/diff/commit) trên các tệp trong một kho lưu trữ khi thư mục hiện tại của tôi không có trong kho lưu trữ] hay không (http://stackoverflow.com/questions/3205867/can-i- perform-git-operation-add-diff-cam-on-files-in-a-repository-when-my) – Hilikus

Trả lời

27

Hãy thử:

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

Điều quan trọng là để cho con đường tất cả các con đường lê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 thông báo lỗi có nội dung như sau:

fatal: Not a git repository 
+0

Tại sao lại là downvote? Đây có vẻ là câu trả lời đúng. –

+1

Tôi tiếp tục bị 'gây tử vong: Không phải kho lưu trữ git (hoặc bất kỳ thư mục cha nào): .git'. @ Patrick Tôi đã không bỏ phiếu bất cứ điều gì? – Tower

+2

@Patrick Câu trả lời đã được chỉnh sửa (ban đầu nó đã nói '- work-dir' tôi nghĩ) – Gareth

12

Thực tế bạn cần sử dụng --git-dir và --work-tree với nhau. Dưới đâ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 chính xác hơn câu trả lời chỉ với --git-dir. https://git-scm.com/blog/2010/04/11/environment.html –

68

Sử dụng -C tùy chọn (docs):

git -C /home/repo log 

Đây là gần tương đương với --git-dir--work-tree mà không phụ thêm thông thường .git thư mục

Edit:

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

Ví dụ, để có được các bản ghi của /home/repo/subdir chỉ:

git -C /home/repo/subdir log . 

hoặc

git -C /home/repo log subdir 

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

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

Hơn nữa, --work-tree hoàn toàn không hoạt động với phiên bản log 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 nếu đây là lỗi hoặc tính năng ... như thường lệ với nhiều lựa chọn thiết kế git.

+0

Cảm ơn bạn đã thêm giải thích bổ sung. –

+0

'git stash' là một ví dụ khác của một tiểu nhóm không thành công nếu' --git-dir' và '--work-tree' được sử dụng. – d5ve

+2

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

1

Đ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 đề xuất sử dụng --work-tree.Tôi không chắc liệu sử dụng môi trường hoặc cờ là thích hợp hơn vì vậy tôi sẽ để lại câu trả lời của tôi trong trường hợp ai đó tìm thấy sử dụng trong nó, nhưng tôi sẽ chuyển sang sử dụng --work-tree/--git-dir.


Có hai repos, một bên trong số khác nhưng không phải là mô-đun con; repo 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-prefix tương đối so với repo bên ngoài. Dưới đây là những gì tôi đã đưa ra (cú pháp bash; chia giữa dòng cho dễ đọc):

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

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

1

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 để bạn

C dir

Các vấn đề liên quan