Git: fatal: Pathspec nằm trong mô hình con


145

Tôi đang cố gắng để TravisCI tự động triển khai trang web tĩnh Hakyll của mình, theo hướng dẫn này .

Đây là cách repo của tôi được thiết lập. Tôi có nhánh nguồn của mình, chứa các tệp hakyll và markdown của tôi. Nó xây dựng html vào _sitethư mục, được thiết lập như một mô hình con, được liên kết với masterchi nhánh của tôi .

Tôi xây dựng trang web mà không có vấn đề, sau đó cdvào thư mục _site. Tuy nhiên, khi tôi thử git add ./*các tệp HTML mới tạo, tôi gặp lỗi sau:

fatal: Pathspec './about.html' is in submodule '_site'

Khi tôi thử git add --all, tôi gặp lỗi này:

git: pathspec.c:317: prefix_pathspec: Assertion `item->nowildcard_len <= item->len && item->prefix <= item->len' failed.

/home/travis/build.sh: line 245: 1566 Aborted git add --all

Điều gì gây ra điều này, và làm thế nào tôi có thể tránh điều này?

Bạn có thể xem kho lưu trữ ở đây .

Câu trả lời:


430

Xóa thư mục khỏi git và thêm nó một lần nữa làm việc cho tôi:

 git rm --cached directory
 git add directory

Điều này hoạt động nếu bạn cố tình xóa .gitthư mục vì bạn muốn thêm directoryvào dự án git chính của bạn. Trong trường hợp cụ thể của tôi, tôi đã git nhân bản một phần mở rộng và chạy git add .mà không suy nghĩ quá nhiều. Git quyết định tạo ra một mô hình con, điều mà tôi không thích. Vì vậy, tôi loại bỏ directory/.gitvà chạy vào Git: fatal: Pathspec is in submodule. Tôi không thể tìm ra làm thế nào để loại bỏ các công cụ con. Đã sửa với hai dòng trên.


8
Điều này đã giải quyết một vấn đề mà tôi gặp phải khi vô tình kéo một dự án vào một dự án hiện có, tạo ra một mô hình con. Tôi đã thử mọi đề nghị khác ngoài kia. Xóa thư mục và thêm một lần nữa giải quyết vấn đề của tôi. Cảm ơn.
RevNoah

Tôi có .git và xem nó! Nhưng khi tôi muốn cam kết một số tệp nằm trong một thư mục, nó sẽ hiển thị một lỗi "blahblah không khớp với bất kỳ (các) tệp nào được biết đến"
Dr.jacky

Điều này đã khắc phục vấn đề. Trong trường hợp của tôi, tôi đã nhân bản dự án trong một máy khác.
AntonIva

Tôi đã gặp vấn đề tương tự với một dự án Visual Studio mà tôi đồng bộ với GitHub. Thư mục nơi hầu hết sự phát triển của tôi đang diễn ra không được theo dõi và nếu tôi thử thêm nó, tôi cũng gặp lỗi tương tự. Giải pháp này đã sửa nó cho tôi quá!
JohnRDOrazio

10

Có vẻ như git addbối cảnh là repo cha ("cha mẹ" có nghĩa là cái bao gồm cả mô hình con), kích hoạt cảnh báo.

Hãy thử và thay đổi bối cảnh của nó với:

cd _site
git --git-dir=.git --work-tree=. add . 
git --git-dir=.git --work-tree=. commit -m "new files"

Đừng quên rằng, nếu điều này hoạt động, bạn vẫn sẽ phải quay lại repo cha, và git add _site, vì subrepo sẽ có thay đổi.

Và bạn sẽ phải đẩy cả hai.


Cập nhật tháng 1 năm 2017 (hơn 2 năm sau)

Với Git 2.12, bạn sẽ không thấy điều đó prefix_pathspec: Assertionnữa.

Xem cam kết 2d81c48 (09 tháng 1 năm 2017) của Stefan Beller ( stefanbeller) .
Được giúp đỡ: Jeff King ( peff)Junio ​​C Hamano ( gitster) .
(Được hợp nhất bởi Junio ​​C Hamano - gitster- trong cam kết 00880a1 , ngày 18 tháng 1 năm 2017)

pathspec: đưa ra thông báo tốt hơn cho pathspeclỗi liên quan đến mô hình con

Chạy " git add a/b" khi " a" là một mô hình con bị lỗi chính xác, nhưng không có thông báo lỗi có ý nghĩa.


Tôi nhận được error: unknown option git-dir = .git'`. Ngoài ra, tôi không thể cam kết repo cha mẹ của mình từ bên trong Travis, điều đó sẽ gây ra một vòng lặp vô hạn của Travis đang chạy ...
jmite

@jmite Tôi đã sửa câu trả lời: --git-dir--work-treelà các tùy chọn của gitlệnh, không phải git addlệnh. Hãy thử ít nhất là git addmột phần, nếu git commitkhông thực tế.
VonC

Điều này dường như phá vỡ một cái gì đó cho tôi, nhưng tôi đã có thể tìm thấy giải pháp ở đây
CGTheLegend

4

Có vẻ như vấn đề của tôi là tôi đã vô tình xóa .gitthư mục của mô hình con.


1
Tôi có chính xác cùng một vấn đề. Bạn có thể chia sẻ làm thế nào bạn giải quyết nó?
matt

Tôi đã giải quyết nó bằng cách thay đổi tập lệnh của mình để không xóa thư mục .git. Vì vậy, tôi khuyên bạn nên kiểm tra tập lệnh của mình, xem bạn có thực sự có thư mục .git trong thư mục không.
jmite

1
Tôi làm nhưng tôi muốn thoát khỏi nó vì repo từ xa không còn tồn tại. Nó chỉ dễ dàng hơn cho chúng tôi để bao gồm mã nguồn của nó như nó là.
matt

Bạn nên đặt cược tốt nhất là xem xét việc thay đổi repos từ xa. Hãy nhìn vào git remotelệnh.
jmite

3

Có vẻ như bạn đang hoạt động trên các mô hình con không được khởi tạo (về cơ bản chúng bị thiếu các .gitthư mục), do đó bạn nên khởi tạo chúng trước và cập nhật:

git submodule init
git submodule update

Nếu không, nếu bạn không cần mô hình con này nữa, hãy xóa nó bằng cách:

git submodule deinit _site

hoặc là:

git rm -f --cached _site

và thêm nó một lần nữa:

git add _site

Kiểm tra các mô hình con nổi bật hiện tại của bạn bằng cách : git submodule status.

Xem thêm: Tại sao git bị lỗi với 'Xác nhận thất bại' trên git add.?


1

Khắc phục 100% cho sự cố này, ngay cả khi bạn có nhiều hơn một thư mục mô hình con trong dự án:

> git submodule foreach --recursive deinit -f --all -- <relative path>
> git add --all -f
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.