git --git-dir không hoạt động như mong đợi


209

Tôi đang cố chạy git từ một thư mục khác với tôi đang ở. Vì vậy, ví dụ nếu tôi đang ở:

cd /home/domain/
git status << runs perfect ie
# On branch master
# Your branch is ahead of 'origin/master' by 6 commits.

Vì vậy, bây giờ tôi muốn chạy lệnh này từ một thư mục khác bằng cách sử dụng --git-dirtùy chọn.

Vì vậy, hãy nói rằng tôi tham gia root/và thử điều này:

git --git-dir="/home/domain/" status
## Error 
fatal: Not a git repository: '/home/domain/'

Tôi cũng đã cố gắng bao gồm .gitthư mục tức là

git --git-dir="/home/domain/.git/" status

Nhưng điều này có vẻ như nó đang cố chạy git từ thư mục gốc, tức là xóa mọi thứ khỏi thư mục miền của tôi và thêm mọi thứ vào thư mục gốc.

Hy vọng ai đó có thể tư vấn về những gì tôi đang làm sai.


4
Bây giờ tôi có trạng thái làm việc hoàn hảo nhưng kéo là lỗi. tức là root @ erx [/] # git --git-dir = / home / domain / .git --work-tree = / home / domain / pull origin master fatal: / usr / local / libexec / git-core / git -pull không thể được sử dụng mà không có cây làm việc. Nhưng tình trạng hoạt động ?? bất kỳ ý tưởng nào Jon
Lee

4
Đây là lỗi lớn nhất trong git ngay bây giờ. Không tôn trọng các tham số --work-tree và / hoặc --git-dir.
Adam Dymitruk

5
Bắt đầu từ git 1.8.5, bạn sẽ có lựa chọn không đặt --git-dir--work-treecho một lệnh đơn giản: xem câu trả lời của tôi bên dưới
VonC

Câu trả lời:


314

Bạn phải xác định các dir làm việc là tốt. Bối rối tôi biết nhưng đó là một điều linh hoạt.

git --git-dir=/mycode/.git --work-tree=/mycode status

Bạn có thể đọc thêm một chút ở đây


3
Cảm ơn điều này đã làm việc! Đồng ý rằng điều này là khó hiểu. Nó được gọi là Keep It Simple St ngu. Bạn hầu như luôn có thể cho phép sự linh hoạt đồng thời đưa ra các mặc định khiến cho VS có ý nghĩa nhất có một lệnh không hoạt động.
Nay

3
@Nick đồng ý, bạn sẽ nghĩ nếu --git-dirkhông được chỉ định, nó sẽ kiểm tra xem có /mycode/.gittồn tại không và sử dụng nó trước khi đưa ra lỗi.
GP89

4
@NickYeates biệt phái! Ngoài ra, tôi gặp vấn đề khi sử dụng ~ để tham khảo thư mục nhà của mình, ví dụ git --git-dir=~/src/s3cmd/.git --work-tree=~/src/s3cmd pullnhư không hoạt động nhưng git --git-dir=/home/username/src/s3cmd/.git --work-tree=/home/username/src/s3cmd pullđã làm
Jamie Cook

1
Lưu ý rằng không phải tất cả các lệnh đều yêu cầu cây công việc, ví dụ: "git --git-dir = / mycode / .git log" hoạt động tốt. Đồng ý về điều này là khó hiểu mặc dù!
yoyo

4
Làm rõ một chút: git --git-dir="$HOME/foo/.git" --work-tree="$HOME/foo" status
Haris Krajina

136

Bắt đầu git 1.8.5 (sẽ ra vào tuần tới), nó sẽ còn đơn giản hơn nữa:

 git -C "/home/domain/" status

Không cần phải thiết lập --git-dir--work-treenữa!


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

Phải mất nhiều lần nhấn phím hơ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-dir=~/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, những điều 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

4
Tôi đã bị vấp khi cố gắng sử dụng cờ -C sau lệnh git (ví dụ: git status -C <path>sẽ không hoạt động!)
Kedar Paranjape 21/03/19

42

Dựa trên nhận xét của bạn ở trên, có vẻ như bạn vẫn đang gặp phải một vấn đề:

root @ erx [/] # git --git-dir = / home / domain / .git --work-tree = / home / domain / pull origin master
gây tử vong: / usr / local / libexec / git-core / git-pull không thể được sử dụng mà không có cây làm việc

Có vẻ như bạn có thể có ý định chạy cái này từ crontabhoặc cái gì đó. Bạn có thể tốt hơn hết là sử dụng cdđể chuyển sang thư mục làm việc của bạn trước. Ví dụ:

root @ erx [/] # (cd / home / domain && git pull origin master)

Điều này sẽ tạm thời (trong một lớp con, đó là những gì dấu ngoặc đơn làm) thay đổi thư mục hiện tại thành /home/domain, sau đó chạy git pull origin master. Sau khi lệnh hoàn thành, thư mục hiện tại của bạn vẫn giữ nguyên bất cứ thứ gì trước lệnh.


Sử dụng một subshell là đơn giản và thanh lịch. Tôi không biết tại sao tôi không nghĩ về điều đó trước đây!
Ehtesh Choudhury

Xin lỗi @Greg, đã bỏ phiếu cho câu trả lời khác của Jon khi nó trả lời câu hỏi được hỏi - nhưng tôi nghĩ rằng bạn đang phát hiện ra và trả lời ý định và cái nhìn sâu sắc của bạn, tức là (), chính xác là những gì tôi đang tìm kiếm +10
Darren Giám mục

1
git --git-dir="/home/domain/" status
## Error 
fatal: Not a git repository: '/home/domain/'

Với Git 2.26 (Q1 2020), tài liệu rõ ràng hơn.

Một hiệu ứng của việc chỉ định vị trí GIT_DIR(với biến môi trường hoặc với git --git-dir=<where> cmdtùy chọn "") là vô hiệu hóa khám phá kho lưu trữ .

Điều này đã được đặt thêm một chút căng thẳng trong tài liệu, vì người dùng mới thường bị nhầm lẫn.

Xem cam kết d82ad54 (30 tháng 1 năm 2020) của Heba Waly ( HebaWaly) .
(Được hợp nhất bởi Junio ​​C Hamano - gitster- trong cam kết 17e4a1b , ngày 12 tháng 2 năm 2020)

git: cập nhật tài liệu cho --git-dir

Đã ký tắt: Heba Waly
Được giúp đỡ: Junio ​​C Hamano

git --git-dir <path> hơi khó hiểu và đôi khi không hoạt động như người dùng mong đợi.

Ví dụ: nếu người dùng chạy git --git-dir=<path> status, git sẽ bỏ qua thuật toán khám phá kho lưu trữ và sẽ gán cây công việc cho thư mục công việc hiện tại của người dùng trừ khi có quy định khác.
Khi gán này sai, đầu ra sẽ không phù hợp với mong đợi của người dùng.

Bản vá này cập nhật các tài liệu để làm cho nó rõ ràng hơn.

Vì vậy, tài liệu chogit --git-dir bây giờ bao gồm:

--git-dir=<path>:

Đặt đường dẫn đến kho lưu trữ ( .gitthư mục "").
Đ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.

Chỉ định vị trí của thư mục " .git" bằng tùy chọn này (hoặc GIT_DIRbiến môi trường) sẽ tắt khám phá kho lưu trữ cố gắng tìm .gitthư mục có thư mục con "" (đó là cách phát hiện kho lưu trữ và cấp cao nhất của cây làm việc), và nói với Git rằng bạn đang ở cấp cao nhất của cây làm việc.

Nếu bạn không ở thư mục cấp cao nhất của cây làm việc, bạn nên cho Git biết nơi cấp cao nhất của cây làm việc, với --work-tree=<path>tùy chọn (hoặc GIT_WORK_TREEbiến môi trường)

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.