Sử dụng lệnh git trên log log trong thư mục khác


127

Tôi có một số tệp php trong Thư mục A (là một dự án git). Trong các tệp php này tôi muốn thực thi "git log" nhưng đối với thư mục B. Thư mục B là một dự án git khác (vì vậy nhật ký khác nhau giữa A và B).

Làm thế nào tôi có thể làm điều đó với lệnh shell?


3
cd /other/dir && git log && cd -trong vỏ bash?
takeshin

1
Với git 1.8.5 (Q4 2013), bạn sẽ có một lựa chọn khác, thay vì cài đặt --git-dir: xem câu trả lời của tôi bên dưới
VonC

Câu trả lời:


188

Từ , man git:

Bạn có thể làm điều này với --git-dirtham số, trước khi truyền bất kỳ lệnh nào.

git --git-dir /foo/bar/.git log

(Chỉ định .gitthư mục là cần thiết.) Từ tài liệu :

--git-dir=<path>

Đặt đường dẫn đến kho lưu trữ. Điều này cũng có thể được kiểm soát bằng cách đặt GIT_DIRbiến môi trường. Nó có thể là một đường dẫn tuyệt đối hoặc đường dẫn tương đối đến thư mục làm việc hiện tại.


26
Bạn phải tham khảo .gitthư mục. Hãy thử git --git-dir=/foo/bar/.git log.
mipadi

6
xin lỗi, tôi sai, bạn không đặt = giữa --git-dir và tên thư mục. vì vậy nó trở thành git --git-dir / foo / bar log
rgngl

23
Cảnh báo! Cách tiếp cận này bị hỏng cho các hoạt động khác log. Hãy thử git --git-dir /foo/someclone/.git status- git bị nhầm lẫn hoàn toàn. Tôi đề nghị -Cnhư ghi chú dưới đây.
Không khí

Tôi vẫn chưa bắt gặp một trang trợ giúp git bao gồm chuỗi "--git-dir": '(
thinsoldier

1
@thinsoldier man githiện trên hệ thống của tôi (2.3.5). Nhưng câu trả lời @VonC hoạt động tốt hơn nhiều.
Calimo

144

Với git 1.8.5 (Q4 2013) , bạn sẽ có lựa chọn khác, thay vì cài đặt --git-dir.
Nếu bạn muốn thực thi git logtrong thư mục B, gõ:

git -C B log

Giống như " make -C <directory>", " git -C <directory> ..." bảo Git đến đó trước khi làm bất cứ điều gì khác .


Xem cam kết 44e1e4 của Nazri Ramliy :

Phải mất nhiều lần nhấn để gọi lệnh git trong một thư mục khác mà không cần rời khỏi thư mục hiện tại:

  1. (cd ~/foo && git status)
    git --git-dir=~/foo/.git --work-tree=~/foo status
    GIT_DIR=~/foo/.git GIT_WORK_TREE=~/foo git status
  2. (cd ../..; git grep foo)
  3. for d in d1 d2 d3; do (cd $d && git svn rebase); done

Các phương thức hiển thị ở trên có thể chấp nhận được đối với kịch bản nhưng quá cồng kềnh đối với các yêu cầu dòng lệnh nhanh.

Với tùy chọn mới này, việc trên có thể được thực hiện với ít lần nhấn phím hơn:

  1. git -C ~/foo status
  2. git -C ../.. grep foo
  3. for d in d1 d2 d3; do git -C $d svn rebase; done

19
Đây là một cách tiếp cận đáng tin cậy hơn nhiều và hoạt động cho các lệnh khác hơn log.
Không khí

wow, và không có gì trong trang người đàn ông! Xấu hổ làm sao. (ok, bây giờ tôi thấy nó được thêm vào trong trang 2,7 người)
akostadinov

Đáng buồn thay, điều này vẫn không hoàn toàn tốt đẹp như -Rtùy chọn của Mercurial , vì nó làm rối tung các đường dẫn tương đối. Ví dụ, nếu tôi gõ, git -C subdir log subdir/myfilenó sẽ báo lỗi (vì nó tìm tệp subdir/subdir/myfile).
JWD

--git-dir sẽ đẹp hơn khi bạn làm một cái gì đó như thế này:for p in (find . -type d -name ".git"); do git --git-dir $p ...; done
shabunc

1
@jwd: Tôi không chắc đó là vấn đề như thế nào? Những gì bạn trích dẫn là hành vi chính xác mà tôi mong đợi và tôi không muốn gitnghĩ rằng nó thông minh hơn tôi và những gì tôi đã gõ. Nếu tôi nói 'chạy cái này trong thư mục X', tôi không có nghĩa là 'ngoại trừ đôi khi, hãy làm gì đó khác'.
gạch dưới
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.