2009-09-06 34 views
176

Tôi cố gắng để chạy git từ một thư mục khác nhau hơn là tôi đang ở Vì vậy, ví dụ nếu tôi đang ở:.git --git-dir không làm việc như mong đợi

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 này lệnh từ một thư mục khác bằng cách sử dụng tùy chọn --git-dir.

Vì vậy, cho phép nói rằng tôi đang ở 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 các thư mục .git tức

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

Nhưng điều này có vẻ như nó đang cố gắng chạy git từ thư mục gốc, nghĩa là xóa mọi thứ khỏi thư mục tên 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 nhận được trạng thái làm việc hoàn hảo nhưng kéo được đưa ra lỗi. tức là 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 nếu không có cây làm việc. Nhưng trạng thái 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. –

+3

Bắt đầu từ git 1.8.5, bạn sẽ có lựa chọn để * không * đặt '--git-dir' và' --work-tree' cho một lệnh đơn giản: xem [câu trả lời của tôi dưới đây] (http: // stackoverflow. com/a/20115678/6309) – VonC

Trả lời

258

Bạn cũng phải xác định thư mục hoạt động. Nhầm lẫn 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 here

+2

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

+3

@Nick đồng ý, bạn sẽ nghĩ rằng nếu '--git-dir' không được chỉ định, nó sẽ kiểm tra nếu'/mycode/.git' tồn tại và sử dụng nó trước khi ném một lỗi. – GP89

+3

@NickYeates được ưu tiên! Ngoài ra tôi đã có một vấn đề khi sử dụng ~ để tham khảo thư mục chính của tôi, ví dụ: 'git - git-dir = ~/src/s3cmd/.git --work-tree = ~/src/s3cmd pull' không hoạt động nhưng 'git --git-dir =/home/username/src/s3cmd/.git --work-tree =/home/username/src/s3cmd pull' đã làm –

38

Dựa trên nhận xét của bạn ở trên, có vẻ như bạn vẫn đang chạy vào một vấn đề:

 
[email protected] [/]# git --git-dir=/home/domain/.git --work-tree=/home/domain/ pull origin master 
fatal: /usr/local/libexec/git-core/git-pull cannot be used without a working tree 

Có vẻ như bạn có thể có ý định chạy từ crontab hoặc thứ gì đó. Bạn có thể nên sử dụng cd để chuyển sang thư mục làm việc của mình trước tiên. Ví dụ:

 
[email protected] [/]# (cd /home/domain && git pull origin master) 

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

+0

Sử dụng subshell đơ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! –

+0

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

96

Bắt đầu git 1.8.5 (mà phải được ra vào tuần tới), nó sẽ được thậm chí đơn giản hơn:

git -C "/home/domain/" status 

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


Xem commit 44e1e4 bởi Nazri Ramliy:

Phải mất hơn bấm phím để gọi lệnh git trong một thư mục khác nhau mà không để lại thư mục hiện hành:

  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 pháp được hiển thị ở trên có thể chấp nhận được cho kịch bản nhưng quá cồng kềnh đối với lời gọi dòng lệnh nhanh.

Với tùy chọn mới này, ở trên có thể được thực hiện với tổ hợp phím ít:

  1. git -C ~/foo status
  2. git -C ../.. grep foo
  3. for d in d1 d2 d3; do git -C $d svn rebase; done
Các vấn đề liên quan