Làm thế nào để thoát khỏi trạng thái con Git không bị theo dõi tình trạng?


149

Tôi dường như không thể thoát khỏi nội dung không bị theo dõi trong các mô hình con của Git. Chạy git statussản lượng:

# Trên nhánh chủ
# Thay đổi không được tổ chức cho cam kết:
# (sử dụng "git add ..." để cập nhật những gì sẽ được cam kết)
# (sử dụng "git checkout - ..." để loại bỏ các thay đổi trong thư mục làm việc)
# (cam kết hoặc loại bỏ nội dung không bị theo dõi hoặc sửa đổi trong các mô hình con)
#
# đã sửa đổi: gói / snipmate (nội dung không bị theo dõi)
# đã sửa đổi: gói / bao quanh (nội dung không bị theo dõi)
# đã sửa đổi: gói / dấu vết-khoảng trắng (nội dung không bị theo dõi)
# đã sửa đổi: gói / zencoding (nội dung không bị theo dõi)
#
không có thay đổi nào được thêm vào cam kết (sử dụng "git add" và / hoặc "git commit -a")

Thêm --ignore-submodulestham số ẩn các thông báo này; nhưng tôi tự hỏi liệu có cách nào để loại bỏ chất bẩn này theo cách phù hợp hơn, cốt lõi hơn không.


3
Câu trả lời này: stackoverflow.com/a/5127213/199649 gợi lên nhiều lựa chọn hơn.
charlax

Câu trả lời:


95

Vì trạng thái git báo cáo nội dung không bị theo dõi, nên cách thực sự để có trạng thái sạch sẽ là đi vào từng một trong các mô hình con đó và:

  • thêm và cam kết các nội dung không bị theo dõi,
  • hoặc tham chiếu các nội dung không bị theo dõi trong một .gitignorecụ thể cho từng mô-đun.
  • hoặc bạn có thể thêm cùng một nội dung bị bỏ qua vào mô hình con .git/info/exclude, như báo cáo peci1 trong các bình luận .
  • hoặc thêm bẩn vào đặc tả mô hình con, như được đề cập trong câu trả lời của ezraspectre (được nâng cấp).

    git config -f .gitmodules submodule.<path>.ignore untracked
    
  • hoặc thêm một tập tin toàn cầu .gitignore (thường ~/.gitignore-global). Ví dụ như .DS_Storetrong trường hợp của tôi Carthage/Buildnhư Marián erný đã báo cáo trong các bình luận . Xem .gitginoretrang người đàn ông :

Các mẫu mà người dùng muốn Git bỏ qua trong mọi tình huống (ví dụ: các tệp sao lưu hoặc tạm thời do trình soạn thảo lựa chọn của người dùng tạo) thường đi vào một tệp được chỉ định bởi core.excludesFilengười dùng ~/.gitconfig. Giá trị mặc định của nó là $XDG_CONFIG_HOME/git/ignore. Nếu $XDG_CONFIG_HOMEkhông được đặt hoặc trống, $HOME/.config/git/ignoređược sử dụng thay thế.


5
+1, tôi đã sẵn sàng hét lên cho đến khi tôi tìm thấy điều này ... sau đó nhận ra một .DS_Storetệp đã được tạo tự động (bởi OS X) trong một trong các mô hình con của tôi, ngăn tôi thực hiện dự án chính. Tranh cãi! Thời gian cập nhật .gitignore...
Courtney Christensen

Sử dụng Xcode, tôi cũng thấy hữu ích khi thêm * .xcuserdatad vào tệp .gitignore-global. Điều này ngăn git cố gắng theo dõi các tùy chọn Xcode cục bộ.
Roy Sharon

Nếu bạn không có quyền đẩy vào mô hình con thì bạn không thể chia sẻ các thay đổi của mình với mô hình con với những người dùng khác của repo cha. Giải pháp của @ quincyglenn dường như hoạt động trong trường hợp như vậy.
Drew Noakes

1
@VonC, một trong hai câu trả lời có ý nghĩa tùy thuộc vào tình huống và sở thích. Tôi muốn làm nổi bật sự khác biệt ở đây như một tài liệu tham khảo cho người khác. Cảm ơn BTW vì nhiều câu trả lời của bạn về Git ở đây trên SO - bạn đã giúp tôi rất nhiều lần.
Drew Noakes

2
Bạn thậm chí có thể làm mà không cần cả hai cam kết và tạo .gitignore (chính nó trở nên không bị theo dõi). Mở mô hình con .git/info/excludevà thêm các dòng bỏ qua ở đó (nó hoạt động như .gitignore, nhưng không phải là một phần của kho lưu trữ được chia sẻ).
Martin Pecka

144

Tôi tìm thấy bài viết blog này để làm việc tổng thể. Bằng cách thêm ignore = dirtytùy chọn cho mỗi một trong các mục trong .gitmodulestệp.

[submodule "zen-coding-gedit3"]
    path = zen-coding-gedit3
    url = git://github.com/leafac/zen-coding-gedit3.git
    ignore = dirty

Giải pháp ưa thích của tôi, vì nó dễ dàng tự động.
lethal-guitar

24
Đáng nói là nó ignore = untrackedcũng tồn tại và hiển thị các tệp được theo dõi đã sửa đổi, nhưng không phải là các tệp không bị theo dõi. Sẽ thật tuyệt nếu có một thiết lập toàn cầu cho điều này cho tất cả các mô hình con ...
naught 101

12

Bạn cũng có thể đi đến từng thư mục con và hoạt động như một git riêng biệt. Ví dụ:

cd my/project/submodule
git status

... / Lấy danh sách các tệp đã sửa đổi /

git add .  //to add all of them to commit into submodule
git commit -m "message to your submodule repo"

bạn cũng có thể cập nhật repo mô đun con từ xa với

git submodule update

sau tất cả


5
Bạn có thể không muốn làm git add .mà không xem lại các tệp đã sửa đổi. Hầu hết thời gian, những thay đổi được thực hiện là các .DS_Storetệp được thêm vào - điều này có lẽ nên được bắt bởi bạn .gitignore, như zourtney đã đề cập trong bình luận đầu tiên cho câu trả lời.
gregoltsov

Trong trường hợp bạn thực sự không muốn cập nhật các mô hình con và muốn trở lại trạng thái ban đầu, bạn có thể muốn chạy git submodule update --force.
Tom

4

Nó có thể là do detached HEADtrong nhánh con của bạn. Nếu đây là trường hợp, đi vào đường dẫn mô hình con của bạn (ví dụ ./bundle/snipmate:), sau đó chạy git checkout master.


2

Tôi đã bị mắc kẹt về vấn đề này ngày hôm qua, trong một dự án có gần 12 mô hình con.

git status đã cho thấy đầu ra.

# On branch master
# Changes not staged for commit:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#   (commit or discard the untracked or modified content in submodules)
#
#   modified:   proj1 (untracked content)
#   modified:   proj1 (modified content, untracked content)
#   ...

Để giải quyết các lỗi nội dung untracked, tôi đã phải loại bỏ các tập tin untracked từ tất cả các môđun con (tất cả là *.pyc, *.pyotập tin được tạo bởi python) sử dụng một .gitignore.

Để giải quyết vấn đề khác, tôi phải chạy git submodule updatecập nhật từng mô hình con.


1

Trong tình huống của tôi, tôi sao chép các mô-đun làm điểm khởi đầu cho một mô-đun mới trong môi trường ZF2 của tôi. Những gì nó làm là đặt thư mục .git của riêng nó vào thư mục.

Giải pháp trong trường hợp này là xóa thư mục .git (có thể bạn sẽ cần hiển thị các tệp ẩn để xem nó).


1

Điều này có thể xảy ra khi bạn có một .git [thư mục ẩn] khác trong thư mục cụ thể ..

đã sửa đổi: ./../ .. (nội dung được sửa đổi, nội dung không bị theo dõi)

đảm bảo thư mục con của bạn không chứa thư mục .git này.

Nếu đó là trường hợp, vấn đề có thể được giải quyết bằng cách xóa thư mục .git bằng tay khỏi thư mục con.


1

Tôi thích sử dụng SourceTree , vì vậy giải pháp cho tôi là mở repo mô đun con trong SourceTree để hiển thị cho tôi danh sách tất cả các tệp không bị theo dõi. Sau đó, tôi chọn tất cả chúng sau đó sử dụng "Xóa".

Tôi đã có thể làm điều này bởi vì tôi biết tất cả các tệp không bị theo dõi thực sự không cần thiết.


1

Điều này làm việc chỉ tốt cho tôi:

git update-index --skip-worktree <path>

Nếu nó không hoạt động với pathname, hãy thử tên tệp. Hãy cho tôi biết nếu điều này làm việc cho bạn quá.


-1

Nếu đây là sự cố tạm thời, bạn có thể vào thư mục mô hình con và chạy git reset HEAD --hardnhưng bạn sẽ mất tất cả các thay đổi bên trong mô hình con.

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.