Vấn đề với việc thêm mã phổ biến dưới dạng mô đun con git: đã tồn tại trong chỉ mục


225

Tôi mới sử dụng git và sẽ đánh giá cao sự trợ giúp khi thêm các mô hình con. Tôi đã nhận được hai dự án chia sẻ một số mã phổ biến. Mã được chia sẻ chỉ được sao chép vào hai dự án. Tôi đã tạo một repo git riêng cho mã chung và xóa nó khỏi các dự án với kế hoạch thêm nó dưới dạng một mô hình con git.

Tôi đã sử dụng tùy chọn đường dẫn của mô đun con git add để chỉ định thư mục:

git submodule add url_to_repo projectfolder

nhưng sau đó đã nhận được lỗi:

'projectfolder' already exists in the index"

Đây là cấu trúc mong muốn của kho lưu trữ của tôi:

repo
|-- projectfolder
    |-- folder with common code

Có thể thêm mô đun con git trực tiếp trong repo hoặc vào một thư mục mới ở đó, nhưng không có trong dự án. Vấn đề là nó thực sự cần phải có trong dự án .. Tôi có thể làm gì về điều này và tôi đã hiểu sai về tùy chọn đường dẫn của mô đun con git add?


Bạn nhận được gì nếu bạn làm gì git ls-files --stage projectfolder?
Mark Longair

Tôi nhận được một danh sách với tất cả nội dung bắt đầu từ 100644.
Vanja


8
cho tôi làm một git rmthư mục hiện có đã giúp: |
rogerdpack

Câu trả lời:


343

Tôi e rằng không có đủ thông tin trong câu hỏi của bạn để chắc chắn về những gì đang diễn ra, vì bạn đã không trả lời câu hỏi tiếp theo của tôi, nhưng điều này có thể giúp ích trong mọi trường hợp.

Lỗi đó có nghĩa projectfolderlà đã được tổ chức ("đã tồn tại trong chỉ mục"). Để tìm hiểu những gì đang xảy ra ở đây, hãy thử liệt kê mọi thứ trong chỉ mục trong thư mục đó với:

git ls-files --stage projectfolder

Cột đầu tiên của đầu ra đó sẽ cho bạn biết loại đối tượng nào trong chỉ mục tại projectfolder. (Chúng trông giống như các tệp Unix, nhưng có ý nghĩa đặc biệt trong git.)

Tôi nghi ngờ rằng bạn sẽ thấy một cái gì đó như:

160000 d00cf29f23627fc54eb992dde6a79112677cd86c 0   projectfolder

(tức là một dòng bắt đầu bằng 160000), trong trường hợp đó, kho lưu trữ trong projectfolderđã được thêm dưới dạng "gitlink". Nếu nó không xuất hiện trong đầu ra của git submodulevà bạn muốn thêm lại nó dưới dạng một mô hình con, bạn có thể làm:

git rm --cached projectfolder

... để giải phóng nó, và sau đó:

git submodule add url_to_repo projectfolder

... để thêm kho lưu trữ dưới dạng mô hình con.

Tuy nhiên, cũng có thể bạn sẽ thấy nhiều đốm màu được liệt kê (với chế độ tệp 100644100755), điều này sẽ gợi ý cho tôi rằng bạn đã không kích hoạt đúng các tệp projectfoldertrước khi sao chép kho lưu trữ mới vào vị trí. Nếu đó là trường hợp, bạn có thể làm như sau để bỏ qua tất cả các tệp đó:

git rm -r --cached projectfolder

... và sau đó thêm mô hình con với:

git submodule add url_to_repo projectfolder

13
Cảm ơn Mark cho câu trả lời chi tiết của bạn. Tôi đã thực hiện một "git rm -r --cached projectfolder" và cố gắng lấy lại mô hình con. Tuy nhiên lần này tôi nhận được thông báo lỗi "'projectfolder' đã tồn tại và không phải là một repo git hợp lệ".
Vanja

3
@Vanja: Điều đó chỉ ra rằng projectfolderkhông chứa .gitthư mục. Nó phát ra từ câu hỏi của bạn như thể bạn đã tạo kho lưu trữ mới cho projectfoldernơi khác và sao chép nó vào vị trí, nhưng rõ ràng đó không phải là trường hợp. Bạn cần di chuyển cái hiện có projectfolderra khỏi đường đi, sau đó sao chép kho lưu trữ mới (hoàn thành với .gitthư mục của nó ) vào vị trí trước khi thêm dưới dạng mô hình con. Hoặc, nếu bạn đã đẩy nó vào kho lưu trữ được đại diện bởi url_to_repo, bạn có thể di chuyển projectfolderra khỏi đường và sau đó thêm mô hình con từ URL đó.
Đánh dấu Longair

câu trả lời tuyệt vời +1 trên mọi nẻo đường
abbood

Điều này đã giúp tôi một tấn. Cảm ơn bạn!
Evan Moran

1
Đây là những gì tôi đã làm, đó là quy trình 3 bước BƯỚC 1: git rm -r --cached src / test / resource /, BƯỚC 2: đã xóa thư mục tài nguyên hiện có sang một nơi khác, BƯỚC 3: mô đun con git thêm add url_to nbpo src / kiểm tra / tài nguyên
vikramvi

52

Loại bỏ mô hình con bằng tay liên quan đến số bước và điều này làm việc cho tôi.

Giả sử bạn đang ở trong thư mục gốc của dự án và tên mô-đun git mẫu là "c3-pro-ios-framework"

Loại bỏ các tệp liên quan đến mô hình con

rm -rf .git/modules/c3-pro-ios-framework/

Xóa mọi tham chiếu đến mô hình con trong cấu hình

vim .git/config

nhập mô tả hình ảnh ở đây

Loại bỏ .gitmodules

rm -rf .gitmodules

Xóa nó khỏi bộ đệm mà không có "git"

git rm --cached c3-pro-ios-framework

Thêm mô hình con

git submodule add https://github.com/chb/c3-pro-ios-framework.git

2
Bài tuyệt vời, công trình tuyệt vời. Tuyệt vời để chia sẻ nó, thưa ông. Thực sự tuyệt vời.
gabn88

1
Tôi đã cố gắng liệt kê các mô hình con thông qua git submodulesau khi loại bỏ và trước khi thêm và nó đã cho tôi một lỗi, cam kết loại bỏ đã chăm sóc nó.
mehmet

1
Tôi sẽ nâng cấp 50x này nếu tôi có thể; bạn vừa cứu ngày của tôi!
Sensei James

touch .gitmodules(cần phải ở trong cây làm việc, vì vậy loại bỏ nó sẽ giúp. Nhưng bạn cần thêm lại nó một lần nữa). Bài viết tuyệt vời btw. Chỉ có điều làm việc ở đây.
Torxed

Đó là .gitthư mục vẫn còn sót lại cho tôi. Điều này đã làm việc tuyệt vời. Cảm ơn bạn.
Kevin Anderson

44

Trước tiên, bạn cần xóa kho lưu trữ git mô đun con (dự án trong trường hợp này) cho đường dẫn git.

rm -rf projectfolder

git rm -r projectfolder

và sau đó thêm mô hình con

git submodule add <git_submodule_repository> projectfolder

4
git submodule add --force <git_submodule_repository>làm việc cho tôi để giữ cùng tên mô hình con
Tenfrow

1
Cảm ơn!! Tôi không phải thêm vào thư mục dự án, tôi chỉ đổi thành thư mục con và nhân bản từ đó.
Tony Fraser

32

Tôi đã có cùng một vấn đề và sau nhiều giờ tìm kiếm câu trả lời.

Lỗi tôi gặp phải có một chút khác biệt: <path> already exists and is not a valid git repo(và được thêm vào đây cho giá trị SEO)

Giải pháp là KHÔNG tạo thư mục chứa mô hình con. Thư mục sẽ được tạo như một phần của git submodule addlệnh.

Ngoài ra, đối số dự kiến ​​sẽ liên quan đến gốc cha-repo, không phải thư mục làm việc của bạn, vì vậy hãy coi chừng điều đó.

Giải pháp cho ví dụ trên:

  1. Sẽ không sao nếu repo cha mẹ của bạn đã được nhân bản.
  2. Hãy chắc chắn rằng common_codethư mục không tồn tại.
  3. cd Repo
  4. git submodule add git://url_to_repo projectfolder/common_code/( Lưu ý dấu gạch chéo yêu cầu. )
  5. Phục hồi tinh thần.

Tôi hy vọng điều này sẽ giúp được ai đó, vì có rất ít thông tin được tìm thấy ở nơi khác về điều này.


1
Bước 4 sẽ bắt đầu git submodule addvà dấu gạch chéo không bắt buộc.
nullability

Sửa lỗi chính tả. Tôi đã kiểm tra lại nó, và dấu gạch chéo đã tạo ra sự khác biệt cho tôi. Tôi đang sử dụng zsh nếu điều đó có hiệu lực.
không xác định

Điều này đã giải quyết vấn đề của tôi (tạo thư mục với dấu phẩy con thêm), cảm ơn bạn!
jackJoe

18

nếu tồn tại một thư mục có tên xdưới sự kiểm soát của git, bạn muốn thêm một mô hình con cùng tên, bạn nên xóa thư mục đó xvà xác nhận nó trước .

Cập nhật bởi @ ujjwal-singh:

Cam kết là không cần thiết, dàn dựng đủ .. git add/git rm -r


Cam kết là những gì tôi đã bỏ lỡ. Câu trả lời ngắn, nhưng đúng một!
Qqwy

3
Cam kết là không cần thiết, dàn dựng đủ .. git add/gir rm -r
Ujjwal Singh

3

Chỉ cần làm rõ bằng ngôn ngữ của con người những gì lỗi đang cố nói với bạn:

Bạn không thể tạo một kho lưu trữ trong thư mục này đã được theo dõi trong kho lưu trữ chính.

Ví dụ: Bạn có một thư mục chủ đề được gọi là AwesomeThemekho lưu trữ chuyên dụng, bạn thử đổ trực tiếp vào kho lưu trữ chính của mình git submodule add sites/themesvà bạn nhận được thư mục này "AwesomeTheme" index already exists.

Bạn chỉ cần đảm bảo rằng đã không có sites/themes/AwesomeThemetrong theo dõi phiên bản của kho lưu trữ chính để mô hình con có thể được tạo ở đó.

Vì vậy, để khắc phục, trong kho lưu trữ chính của bạn nếu bạn có một sites/theme/AwesomeThemethư mục trống thì hãy xóa nó. Nếu bạn đã thực hiện các cam kết với sites/theme/AwesomeThemethư mục trong kho lưu trữ chính của mình, bạn cần xóa tất cả lịch sử của nó bằng một lệnh như thế này:

git filter-branch --index-filter \
              'git rm -r --cached --ignore-unmatch sites/theme/AwesomeTheme'     HEAD

Bây giờ bạn có thể chạy git submodule add git@AwesomeTheme.repowhateverurlthing sites/themes/AwesomeTheme

Vì kho lưu trữ chính chưa bao giờ nhìn thấy bất cứ thứ gì (còn gọi là index'd) sites/themes/AwesomeThemetrước đây, giờ đây nó có thể tạo ra nó.


1

Tôi đã làm cho nó hoạt động bằng cách làm theo cách khác. Bắt đầu với một repo trống, thêm mô hình con vào một thư mục mới gọi là "projectfolder / common_code". Sau đó, có thể thêm mã dự án trong projectfolder. Các chi tiết được hiển thị dưới đây.

Trong một loại repo trống:

git submodule add url_to_repo projectfolder/common_code

Điều đó sẽ tạo ra cấu trúc thư mục mong muốn:

repo
|-- projectfolder
    |-- common_code

Bây giờ có thể thêm nhiều mô hình con hơn và mã dự án có thể được thêm vào dự án.

Tôi chưa thể nói lý do tại sao nó hoạt động theo cách này chứ không phải cách khác.


0

Không biết điều này có hữu ích không, mặc dù tôi gặp vấn đề tương tự khi cố gắng cam kết các tệp của mình từ trong IntelliJ 15. Cuối cùng, tôi đã mở SourceTree và trong đó tôi chỉ có thể cam kết tệp. Vấn đề được giải quyết. Không cần phải phát hành bất kỳ lệnh git ưa thích. Chỉ cần đề cập đến nó trong trường hợp bất cứ ai có cùng một vấn đề.


0

Chuyển đến thư mục kho lưu trữ. Xóa các mô hình con có liên quan từ .gitmodules. Chọn hiển thị các tập tin ẩn. Chuyển đến thư mục .git, xóa các mô hình con khỏi thư mục mô-đun và cấu hình.


0

Điều này xảy ra nếu tệp .git bị thiếu trong đường dẫn đích. Nó hạnh phúc với tôi sau khi tôi thực hiện git clean -f -d.

Tôi đã phải xóa tất cả các thư mục đích hiển thị trong tin nhắn và sau đó thực thi git submodule update --remote


-18

Trong thư mục git của bạn, giả sử bạn đã đồng bộ tất cả các thay đổi.

rm -rf .git 

rm -rf .gitmodules

Sau đó làm:

git init
git submodule add url_to_repo projectfolder

2
điều này sẽ xóa toàn bộ lịch sử của dự án!
redbandit
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.