Tại sao tôi nhận được thông báo, "nghiêm trọng: Hoạt động này phải được chạy trong cây công việc?"


83

Chỉ cần cài đặt git trên Windows. Tôi đặt biến GIT_DIR thành c: \ git \ và xác minh rằng biến môi trường này được cygwin duy trì (ví dụ: echo $ GIT_DIR là giá trị của nó). Tôi đã đi đến thư mục mà tôi muốn tạo kho lưu trữ git, giả sử c: \ www, rồi chạy:

git init
git add .

Sau đó, tôi gặp lỗi:

fatal: This operation must be run in a work tree

Tôi không chắc đã xảy ra sự cố gì, nhưng thư mục c: \ git có tệp cấu hình cho biết:

[core]
    repositoryformatversion = 0
    filemode = false
    bare = true
    symlinks = false
    ignorecase = true

Tôi khá chắc rằng điều này không nên để trần và đó là vấn đề của chúng tôi.


1
GIT_DIR là một khái niệm hoàn toàn khác với CVSROOT!
innaM 22/09/09

Câu trả lời:


54

Lý do trực tiếp cho lỗi là có, không thể sử dụng git-addvới kho lưu trữ trống. Một kho lưu trữ trống, theo định nghĩa, không có cây công việc. git-addlấy các tệp từ cây công việc và thêm chúng vào chỉ mục, để chuẩn bị cho việc cam kết.

Tuy nhiên, bạn có thể cần phải suy nghĩ một chút về thiết lập của mình ở đây. GIT_DIR là thư mục kho lưu trữ được sử dụng cho tất cả các lệnh git. Bạn có thực sự đang cố gắng tạo một kho lưu trữ duy nhất cho mọi thứ bạn theo dõi, có thể là mọi thứ trên toàn hệ thống của bạn không? Một kho lưu trữ git về bản chất theo dõi nội dung của một thư mục duy nhất. Bạn sẽ cần đặt GIT_WORK_TREEthành một đường dẫn chứa mọi thứ bạn muốn theo dõi và sau đó bạn sẽ cần một đường dẫn .gitignoređể chặn mọi thứ bạn không muốn theo dõi.

Có thể bạn đang cố gắng tạo một kho lưu trữ để theo dõi c:\www? Sau đó, bạn nên đặt nó vào c:\www(không đặt GIT_DIR). Đây là cách sử dụng bình thường của git, với kho lưu trữ trong thư mục .git của thư mục cấp cao nhất của "mô-đun" của bạn.

Trừ khi bạn có một lý do thực sự chính đáng, tôi khuyên bạn nên kiên trì với cách thức hoạt động của git. Nếu bạn có một số thứ cần theo dõi, bạn có thể muốn có một số kho lưu trữ!


10
1. Chúng tôi chỉ làm theo 'Everyday GIT in 20 command' và git-init (1) manpPage của Linus T. (tiếc là có thể đã lỗi thời?) 2. Bài đăng của bạn chỉ gợi ý điều gì sai nhưng không cho chúng tôi biết đầu mối để làm gì về nó

54
Chỉ là git config --unset core.bare.
Matthias Urlichs

Vấn đề của tôi đã được giải quyết bằng câu trả lời của blj nhưng bên trong thư mục con đó, bằng cách sử dụng git branchlệnh, tôi có thể liệt kê các nhánh, nhưng tôi không thể làm được git checkout -b feature22. Điều đó có nghĩa là để liệt kê các nhánh, nó không cần cây làm việc, nhưng để kiểm tra thì có?
Honey,

203

Ngoài ra, có thể bạn đang ở bên trong thư mục con .git, hãy chuyển một thư mục lên thư mục gốc dự án của bạn.


7
Câu trả lời hay nhất mà tôi đã thấy! Nên là câu trả lời được chấp nhận.
GeertVc

Đây là câu trả lời tốt nhất. Tôi đã từng gặp. vấn đề nhỏ. giải pháp nhỏ. yêu nó.
Ariful Islam

2
Có cách nào để ngăn chặn thông báo này?
roachsinai

lol ... bạn đã hiểu tôi. +1
Mushanthrax

17

Đề phòng trường hợp những gì đã xảy ra với tôi lại xảy ra với người khác, tôi cần phải nói điều này: Tôi đã ở trong thư mục .git trong dự án của mình khi gặp lỗi này. Tôi đã tìm kiếm và lùng sục để tìm câu trả lời, nhưng không có gì hiệu quả. Tất cả những gì tôi phải làm là quay lại đúng thư mục. Đó là một khoảnh khắc chạm mặt đối với tôi. Trong trường hợp có ai khác ngớ ngẩn như tôi, tôi hy vọng bạn thấy câu trả lời này hữu ích.


1
Kinh nghiệm tương tự. Trong trường hợp của tôi, tôi đang sử dụng GitExtensions (dành cho windows) và khi cố gắng mở kho lưu trữ, tôi đã nhấp để mở tệp .git thay vì thư mục chứa. Thoạt nhìn có vẻ ổn nhưng đã cho tôi lỗi cây khi tôi bắt đầu thực sự làm bất cứ điều gì.
sấm

1
Tôi thích rằng điều này có một tá ủng hộ. Tôi rất vui vì tôi đã đăng câu trả lời này, mặc dù nó có vẻ khá hiển nhiên.
Jacob Zimmerman

12

Chỉ cần sao chép cùng một dự án trong một thư mục khác và sao chép các .git / thư mục để dự án của bạn.

Thí dụ

Tạo thư mục tạm thời:

mkdir temp

chuyển sang thư mục tạm thời

cd temp/

sao chép cùng một dự án trong thư mục tạm thời :

git clone [-b branchName] git@path_to_your_git_repository

sao chép thư mục .git vào projet của bạn:

cp -R .git/ path/to/your/project/

chuyển sang dự án của bạn và chạy git status

xóa các tạm thời thư mục nếu bạn đã kết thúc.

hy vọng điều này sẽ giúp ai đó


1
Tôi thấy điều này hữu ích, nhưng tôi phải nói rằng dòng đầu tiên đủ để khiến tôi nhận ra điều gì sai. Phần còn lại của nó thực sự làm tôi bối rối một chút. Dù sao cũng cảm ơn rất nhiều :)
randombee

@randombee Điều này hiệu quả với tôi. . . nhưng tại sao? Điều này làm gì?
Yatharth Agarwal


8

Việc thiết lập rõ ràng GIT_DIRbiến môi trường buộc git phải sử dụng thư mục đã cho làm kho lưu trữ git. Nó không bao giờ cần thiết trong quá trình sử dụng bình thường.

Trong ví dụ của bạn, vì đã chỉ định a GIT_DIRvà nó không được đặt tên .git(dấu chấm ở đầu là quan trọng) và bạn chưa cung cấp --work-treetùy chọn hoặc đặt GIT_WORK_TREEbiến môi trường nên bạn muốn có một kho lưu trữ trống khi nói git init.

Bởi vì một kho lưu trữ trống không có cây làm việc, một loạt các lệnh không có ý nghĩa với một kho lưu trữ trống. git addchỉ là một.

Có lý do cụ thể nào khiến bạn cần sử dụng vị trí không chuẩn cho kho lưu trữ git của mình, thay vì trong một .gitthư mục con dưới gốc cây làm việc không? Mặc dù có thể sắp xếp điều này nhưng nó có xu hướng tốn nhiều công sức hơn và chịu nhiều trách nhiệm hơn đối với những sai sót của người dùng.


Cài đặt GIT_WORK_TREE đã giải quyết được vấn đề đó cho tôi. Lý do tôi đang sử dụng GIT_DIR là tôi muốn có một kho git riêng cho bản sao làm việc của mình, nơi tôi có một tác vụ nền chỉ thêm / cam kết vài phút một lần. Quá trình này đặt GIT_DIR thành .gitsave. Công việc repo thực tế của tôi là .git. Bây giờ tôi có một kho lưu trữ theo dõi trực tiếp cục bộ nên tôi có các phiên bản của tất cả các tệp khi tôi thay đổi chúng.
MikeJansen

6

Tạo kho lưu trữ GIT trống

Một rant nhỏ: git không thể tự tạo một kho lưu trữ trống thông thường. Thật là ngu ngốc.

Nói một cách chính xác, không thể sao chép các kho lưu trữ trống. Vì vậy, một kho lưu trữ trống là một kho lưu trữ vô dụng. Thật vậy, bạn thường tạo một kho lưu trữ trống và ngay lập tức lấp đầy nó:

git init
git add .

Tuy nhiên, không thể thêm git khi bạn tạo một kho lưu trữ trống:

git --bare init
git add .

đưa ra lỗi "nghiêm trọng: Thao tác này phải được chạy trong cây công việc".

Bạn cũng không thể kiểm tra nó:

Initialized empty Git repository in /home/user/myrepos/.git/
fatal: http://repository.example.org/projects/myrepos.git/info/refs not found: did you run git update-server-info on the server?

git --bare init
git update-server-info # this creates the info/refs file
chown -R <user>:<group> . # make sure others can update the repository

Giải pháp là tạo một kho lưu trữ khác ở nơi khác, thêm một tệp trong kho đó và đẩy nó vào kho lưu trữ trống.

mkdir temp; cd temp
git init
touch .gitignore
git add .gitignore
git commit -m "Initial commit"
git push (url or path of bare repository) master
cd ..; rm -rf temp

hy vọng điều này có thể giúp bạn


1
Đây là sự thật đơn giản. Bạn có thể tạo một kho lưu trữ trống và sao chép nó. Ngay cả khi nó là sự thật, nó vẫn không giải quyết được câu hỏi. (Ví dụ:$ git --bare init bare.git Initialized empty Git repository in /home18/cbailey/gittest8/bare.git/ $ git clone bare.git non-bare Cloning into 'non-bare'... \\ done. \\ warning: You appear to have cloned an empty repository.
CB Bailey

Tôi xin lỗi, nếu tôi sử dụng "<>" để đóng gói "url hoặc đường dẫn của kho lưu trữ", nó sẽ không thể xâm nhập được. và những gì tôi đã nói trên thực sự hữu ích. Tôi đã tự kiểm tra và xác minh.
user1329261

4

Tôi đã có vấn đề này, bởi vì .git/configcó chứa worktree = D:/git-repositories/OldName. Tôi vừa đổi nó thànhworktree = D:/git-repositories/NewName

Tôi đã phát hiện ra điều đó vì tôi đã sử dụng git gui , hiển thị thông báo lỗi chi tiết hơn:

lỗi git gui


1
Tôi đã sử dụng git bash và nhận được tin nhắn fatal: this operation must be run in a work tree. Sửa đổi tệp cấu hình đã sửa nó cho tôi.
pawellipowczan

4

Trong trường hợp của tôi, tôi đã ở trong cùng một thư mục với tệp ".git" cho repo của tôi. Tôi đã phải nâng cấp một thư mục, nó đã giải quyết được nó.


2

Nếu không có gì khác có vẻ hoạt động, hãy kiểm tra kỹ đường dẫn vào git config core.worktree. Nếu đường dẫn đó không trỏ đến thư mục làm việc của bạn, bạn có thể cần cập nhật nó.

Cách tôi gặp lỗi này là tôi đã tạo kho lưu trữ Git trên ổ đĩa mạng. Nó hoạt động tốt trên một máy tính nhưng trả lại lỗi này trên máy tính khác. Hóa ra là tôi đã ánh xạ ổ đĩa tới ký tự ổ đĩa Windows trên máy tính mà tôi tạo nó, nhưng không phải trên máy tính khác và Git đã lưu đường dẫn đến cây công việc dưới dạng đường dẫn được ánh xạ chứ không phải đường dẫn UNC.


1

Nếu một quy trình kiểm tra hiện có (không phải trần) bắt đầu gây ra lỗi này, hãy kiểm tra tệp .git / config của bạn; nếu core.baređúng, hãy xóa dòng cấu hình đó


0

Nếu các cách thông thường ở trên không giúp được bạn, hãy xem dấu vết cuộc gọi bên dưới thông báo lỗi này ( "fatal: This operation . . .") và xác định tập lệnh và dòng đang gây ra lỗi thực sự. Khi bạn xác định được cuộc gọi () lỗi đó, hãy tắt nó và xem thao tác bạn đang thử có hoàn thành ngay cả với một số cảnh báo / thông báo hay không - hãy bỏ qua chúng ngay bây giờ. Nếu vậy, cuối cùng sau khi hoàn thành nó có thể đề cập đến phần hoạt động chưa hoàn thành thành công. Bây giờ, giải quyết phần này một cách riêng biệt nếu có.

Liên quan đến logic ở trên với trường hợp của tôi, tôi đã nhận được thông báo lỗi này "fatal: This operation . . ."khi tôi cố gắng lấy mã Android-x86 bằng repo sync . . .. và dấu vết cuộc gọi hiển thị raise GitError("cannot initialize work tree")là cuộc gọi lỗi () gây ra thông báo lỗi ở trên ( "fatal: . . ."). Vì vậy, sau khi nhận xét rằng GitError()trong .repo/repo/project.py, repo sync . . .tiếp tục và cuối cùng chỉ ra lỗi cho ba dự án không được đồng bộ hóa đúng cách. Tôi vừa xóa các *.gitthư mục của chúng khỏi các đường dẫn liên quan trong cây nguồn Android-x86 cục bộ và chạy repo sync . . .lại và nếm trải thành công!


0

Vấn đề tương tự mà tôi gặp phải, tôi đã thực hiện các bước sau,

  1. git init
  2. git thêm.
  3. git commit -m "inital setup"
  4. git push -f origin master

thì nó bắt đầu hoạt động.


0

Đã chỉnh sửa tệp cấu hình và thay đổi bare = true thành bare = false


0

Ngoài ra, rõ ràng, lỗi này sẽ xảy ra nếu bạn sao chép vào Ổ đĩa Ram NTFS.

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.