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 cd
về điều đó. Tôi đang làm điều này thông qua một exec
cuộc gọi.
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 cd
về điều đó. Tôi đang làm điều này thông qua một exec
cuộc gọi.
Câu trả lời:
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
fatal: Not a git repository (or any of the parent directories): .git
. @Patrick Tôi không bỏ phiếu gì cả?
--work-dir
tôi nói )
git status
. -C
là cách chính xác để đi.
Sử dụng -C
tùy chọn ( tài liệu ):
git -C /home/repo log
Điều này gần như tương đương --git-dir
và --work-tree
không có thêm .git
thư 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
và --work-tree
khô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 .git
nơ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/subdir
chỉ:
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-dir
hoặ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-tree
không hoạt động với log
tiể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.
git stash
là một ví dụ khác về một tiểu ban thất bại nếu --git-dir
và --work-tree
được sử dụng.
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
Đ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-prefix
liê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
.
Đố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