Làm thế nào để theo dõi nội dung không bị theo dõi?


159

Xem bên dưới dòng rắn cho câu hỏi ban đầu của tôi.

Tôi có một thư mục trong thư mục địa phương của tôi mà không bị theo dõi. Khi tôi chạy git status, tôi nhận được:

Changed but not updated:
modified:   vendor/plugins/open_flash_chart_2 (modified content, untracked content)

Khi tôi gõ git add vendor/plugins/open_flash_chart_2rồi thử git statuslại, nó vẫn báo không bị khóa. Chuyện gì đang xảy ra vậy?


Đây là một bản tóm tắt đơn giản về nửa giờ mới nhất của tôi:

  • Phát hiện ra rằng repo Github của tôi không theo dõi vendor/plugins/open_flash_chart_2plugin của tôi . Cụ thể, không có nội dung và nó hiển thị một mũi tên màu xanh lá cây trên biểu tượng thư mục.

  • Đã thử git submodule init

    No submodule mapping found in .gitmodules for path 'vendor/plugins/open_flash_chart_2'
    
  • Đã thử git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2

    vendor/plugins/open_flash_chart_2 already exists in the index
    
  • git status

    modified: vendor/plugins/open_flash_chart_2 (untracked content)
    
  • Đã tìm kiếm bất kỳ tệp nào có tên .gitmodulestrong thư mục kho lưu trữ / cục bộ của tôi nhưng không thể tìm thấy.

Tôi phải làm gì để các mô đun con của tôi hoạt động để git có thể bắt đầu theo dõi đúng cách?


Điều này có thể không liên quan (tôi bao gồm nó trong trường hợp nó có ích), nhưng mỗi khi tôi gõ git commit -achứ không phải thông thường git commit -m "my comments", nó sẽ xuất hiện một lỗi:

E325: ATTENTION
Found a swap file by the name ".git\.COMMIT-EDITMSG.swp"
         dated: Thu Nov 11 19:45:05 2010
     file name: c:/san/project/.git/COMMIT_EDITMSG
      modified: YES
     user name: San   host name: San-PC
    process ID: 4268
While opening file ".git\COMMIT_EDITMSG"
         dated: Thu Nov 11 20:56:09 2010
  NEWER than swap file!  
Swap file ".git\.COMMIT_EDITMSG.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:
Swap file ".git\.COMMIT_EDITMSG.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:

Tôi là một người mới hoàn toàn tại Github và mặc dù đã cố gắng xem qua tài liệu, tôi hơi bối rối trước những vấn đề đặc biệt này. Cảm ơn bạn.


2
Tôi bối rối về một vài điều. Một: tại sao bạn cứ nói github? tất cả mọi thứ bạn đang nói về âm thanh cục bộ (ngoại trừ mũi tên màu xanh lá cây đó - tôi không biết gì về điều đó). Điều đó có đúng không, hay đây là một câu hỏi về việc đẩy các bản cập nhật lên github? Hai: bạn đã thực sự làm bất cứ điều gì để tạo plugin này như là một mô hình con? Một mô hình con là một kho lưu trữ git theo đúng nghĩa của nó. Bạn tạo nó một cách riêng biệt, sau đó thêm nó vào siêu dự án.
Cascabel

1
Hừm, đầu ra của trạng thái git cho thấy thực sự có một mô hình con ở đó ... nhưng bạn thực sự không có tệp .gitmodules? Thành thực mà nói, nếu plugin này có repo của riêng mình, và bạn biết những gì phiên bản của nó, bạn muốn, bạn có thể chỉ xóa thư mục đó từ dự án của bạn, hãy chắc chắn không có mục trong .gitmodules, và đi qua các thiết lập submodule: git submodule add, git submodule update --init.
Cascabel

Jefromi - Tôi thực sự đã không đề cập đến Github hơn hai lần - lần đầu tiên là do mũi tên màu xanh lá cây xuất hiện trên đầu hình ảnh thư mục màu vàng trong kho lưu trữ Github thực tế cho open_flash_chart_2. Tôi sẽ vui vẻ chỉnh sửa câu trả lời để làm cho nó rõ ràng hơn.
sscirrus

1
@sscirrus: Bạn chắc chắn nên có sở thích, mô hình con hay không. Nếu đây là một thứ bên ngoài bạn sẽ không làm việc, nhưng bạn có thể muốn cập nhật từ đó, thì nó sẽ là một mô hình con. Nếu bạn không quan tâm đến việc nhận các bản cập nhật từ repo ban đầu của nó và có thể muốn tự mình hack nguồn, thì đó không phải là một mô hình con.
Cascabel

1
Câu hỏi này dường như hoàn toàn là về các mô đun con git. Tôi đã xóa một số thẻ vì câu hỏi này không liên quan trực tiếp đến đường ray hoặc github, nó sẽ áp dụng cho tất cả các trường hợp sử dụng git . Và trackingthẻ dường như được sử dụng cho các chủ đề 'theo dõi khách truy cập trang web', do đó sẽ không áp dụng.
edgerunner

Câu trả lời:


239

Bạn đã thêm vendor/plugins/open_flash_chart_2mục nhập của gitlink, nhưng không bao giờ định nghĩa nó là một mô hình con. Thực tế, bạn đang sử dụng tính năng bên trong mà git mô đun con sử dụng (các mục gitlink) nhưng bạn không sử dụng chính tính năng mô hình con.

Bạn có thể đã làm một cái gì đó như thế này:

git clone git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
git add vendor/plugins/open_flash_chart_2

Lệnh cuối cùng này là vấn đề. Thư mục vendor/plugins/open_flash_chart_2bắt đầu như một kho lưu trữ Git độc lập. Thông thường các kho lưu trữ phụ như vậy bị bỏ qua, nhưng nếu bạn nói với git add để thêm nó một cách rõ ràng, thì nó sẽ tạo ra một mục gitlink trỏ đến cam kết HEAD của kho lưu trữ phụ thay vì thêm nội dung của thư mục. Sẽ thật tuyệt nếu git add sẽ từ chối tạo ra những mô hình con nửa mô đun đó.

Các thư mục bình thường được biểu diễn dưới dạng các đối tượng cây trong Git; các đối tượng cây cung cấp tên và quyền cho các đối tượng mà chúng chứa (thường là các đối tượng cây và blob khác tương ứng với các thư mục và tệp). Các mô hình con được thể hiện dưới dạng các mục nhập của gitlink các mục gitlink chỉ chứa tên đối tượng (hàm băm) của cam kết CHÍNH của mô hình con. Kho lưu trữ nguồn của NỮA cho một cam kết của gitlink được chỉ định trong .gitmodulestệp (và .git/configtệp sau khi mô hình con đã được khởi tạo).

Những gì bạn có là một mục trỏ đến một cam kết cụ thể, mà không ghi lại kho lưu trữ nguồn cho cam kết đó. Bạn có thể khắc phục điều này bằng cách biến gitlink của bạn thành một mô hình con phù hợp hoặc bằng cách loại bỏ gitlink và thay thế nó bằng nội dung bình thường của Wap (các tệp và thư mục đơn giản).

Biến nó thành một mô hình con đúng

Bit duy nhất bạn đang thiếu để xác định đúng vendor/plugins/open_flash_chart_2là một mô hình con là một .gitmodulestệp. Thông thường (nếu bạn chưa thêm nó dưới dạng mục nhập gitlink trần), bạn sẽ chỉ sử dụng git submodule add:

git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2

Như bạn đã tìm thấy, điều này sẽ không hoạt động nếu đường dẫn đã tồn tại trong chỉ mục. Giải pháp là tạm thời xóa mục gitlink khỏi chỉ mục và sau đó thêm mô hình con:

git rm --cached vendor/plugins/open_flash_chart_2
git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2

Điều này sẽ sử dụng kho lưu trữ phụ hiện có của bạn (tức là nó sẽ không sao chép lại kho lưu trữ nguồn) và tạo một .gitmodulestệp trông như thế này:

[submodule "vendor/plugins/open_flash_chart_2"]
    path = vendor/plugins/open_flash_chart_2
    url = git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2

Nó cũng sẽ tạo một mục tương tự trong kho lưu trữ chính của bạn .git/config(không có pathcài đặt).

Cam kết rằng và bạn sẽ có một mô hình con thích hợp. Khi bạn sao chép kho lưu trữ (hoặc đẩy vào GitHub và sao chép từ đó), bạn sẽ có thể khởi tạo lại mô hình con thông qua git submodule update --init.

Thay thế nó bằng nội dung đơn giản

Bước tiếp theo giả định rằng kho lưu trữ phụ của bạn vendor/plugins/open_flash_chart_2không có bất kỳ lịch sử cục bộ nào bạn muốn lưu giữ (tức là tất cả những gì bạn quan tâm là cây làm việc hiện tại của kho lưu trữ phụ, không phải lịch sử).

Nếu bạn có lịch sử cục bộ trong kho lưu trữ phụ mà bạn quan tâm, thì bạn nên sao lưu .gitthư mục của kho lưu trữ phụ trước khi xóa nó trong lệnh thứ hai bên dưới. (Cũng xem xét ví dụ về cây con git dưới đây để lưu giữ lịch sử của ĐẦU của kho lưu trữ phụ).

git rm --cached vendor/plugins/open_flash_chart_2
rm -rf vendor/plugins/open_flash_chart_2/.git # BACK THIS UP FIRST unless you are sure you have no local changes in it
git add vendor/plugins/open_flash_chart_2

Lần này khi thêm thư mục, nó không phải là kho lưu trữ phụ, vì vậy các tệp sẽ được thêm bình thường. Thật không may, vì chúng tôi đã xóa .gitthư mục, không có cách nào siêu dễ dàng để giữ mọi thứ cập nhật với kho lưu trữ nguồn.

Bạn có thể xem xét sử dụng hợp nhất cây con thay thế. Làm như vậy sẽ cho phép bạn dễ dàng lấy ra các thay đổi từ kho lưu trữ nguồn trong khi vẫn giữ các tệp trong mạng phẳng phẳng trong kho lưu trữ của bạn (không có mô hình con). Các bên thứ ba git subtree lệnh là một wrapper đẹp xung quanh các chức năng cây con hợp nhất.

git rm --cached vendor/plugins/open_flash_chart_2
git commit -m'converting to subtree; please stand by'
mv vendor/plugins/open_flash_chart_2 ../ofc2.local
git subtree add --prefix=vendor/plugins/open_flash_chart_2 ../ofc2.local HEAD
#rm -rf ../ofc2.local # if HEAD was the only tip with local history

Một lát sau:

git remote add ofc2 git://github.com/korin/open_flash_chart_2_plugin.git
git subtree pull --prefix=vendor/plugins/open_flash_chart_2 ofc2 master

git subtree push --prefix=vendor/plugins/open_flash_chart_2 git@github.com:me/my_ofc2_fork.git changes_for_pull_request

git Subree cũng có một --squashtùy chọn cho phép bạn tránh kết hợp lịch sử của kho lưu trữ nguồn vào lịch sử của mình nhưng vẫn cho phép bạn thay đổi ngược dòng.


Chris, tôi vừa thử rm -rf vendor/plugins/open_flash_chart_2/.gitvà nó nói 'rm' không được công nhận. Sau đó, tôi đã thử git rm -rf vendor/plugins/open_flash_chart_2/.gitvà nó nói fatal: pathspec 'vendor/plugins/open_flash_chart_2/.git' did not match any files(nhưng tôi có thể đến đó trong windows explorer!).
sscirrus

2
Chúng tôi đã thảo luận vấn đề một chút trong trò chuyện . OP đã có thể xóa .gitthư mục của kho lưu trữ phụ và thêm lại các tập tin.
Chris Johnsen

1
Điều này đã cứu cái mông của tôi rất nhiều vào ngày khác. Tôi đã vô tình thêm một cái gì đó với một thư mục .git trong đó vào repo git của tôi, và sau đó git kinda-sorta nghĩ rằng nó có một mô hình con, điều đó làm cho git svn dcommits của tôi phát điên. Tôi sẽ nâng bạn lên 3 lần nếu tôi có thể.
davidtbernal

Muốn chỉ ra, plugin của bên thứ ba subtreekhông bị nhầm lẫn với hợp nhất cây con. Nó không phải là một bọc. Tác giả nói như vậy: P
NebulaFox

@NebulaFox: Trong khi cây con git không phải là chỉ một wrapper xung quanh hòa trộn cây con, nó chắc chắn không sử dụng các kỹ thuật tương tự như các tiêu chuẩn “cây con hợp nhất” thủ tục (ví dụ git readtree --prefix=pathvà cây con hòa trộn: git merge-s subtreehay-Xsubtree=path ). Nó cũng có các tính năng bổ sung tốt trên các ứng dụng hàng đầu, cũng như: --squashchế độ, splitlệnh và pushpullngười trợ giúp.
Chris Johnsen

114

tôi chỉ có cùng một vấn đề. Lý do là vì có một thư mục con chứa thư mục ".git". Loại bỏ nó làm cho git hạnh phúc.


Vâng, điều này đã xảy ra với tôi trong AndroidStudio. Repo git đã được tạo trong thư mục / app trong khi tôi cố gắng tạo một git repo một thư mục. Cảm ơn.
Mã PIN

Tôi đã có một ứng dụng tạo góc cạnh trong nhiều thư mục khác và một thư mục đó có thư mục .git: / Đó là vấn đề thực sự không phải là công cụ mô đun con!
Pascal

Điều này làm việc cho tôi ... Tôi đã thử git thêm nhiều lần, nhưng không có gì xảy ra. sau đó tôi xóa .gitthư mục
Ninja

1
Nhưng nếu tôi vẫn muốn theo dõi thư mục con của mình thì sao? Tôi nên làm gì ?
cyber8200

Có trường hợp tương tự. Vẫn muốn theo dõi thư mục con mà buồn bã cũng chứa một thư mục .git. Sau khi xóa thư mục sufolder .git này, nó không được theo dõi nữa trong thư mục chính .git của tôi ....:
sqp_125


6

Để chỉ ra những gì tôi đã phải khai thác từ cuộc trò chuyện của Chris Johansen với OP (được liên kết từ câu trả lời cho câu trả lời):

git add vendor/plugins/open_flash_chart_2 # sẽ thêm gitlink, nội dung sẽ không bị theo dõi

git add vendor/plugins/open_flash_chart_2/ # THÔNG BÁO RÚT !!!!

Hình thức thứ hai sẽ thêm nó mà không có gitlink và nội dung có thể theo dõi. Các dir .git thuận tiện và tự động bỏ qua. Cảm ơn Chris!


5

Tôi sử dụng mánh khóe được đề xuất bởi Peter Lada mọi lúc, được mệnh danh là "mô hình con giả":

http://debuggable.com/posts/git-fake-submodules:4b563ee4-f3cc-4061-967e-0e48cbdd56cb

Nó rất hữu ích trong một số trường hợp (pe tôi sử dụng nó để giữ tất cả cấu hình Emacs của tôi trong kho lưu trữ, bao gồm cả ĐẦU hiện tại của tất cả các kho lưu trữ git bên trong các thư mục gói elpa / el-get, vì vậy tôi có thể dễ dàng quay lại / chuyển tiếp đến phiên bản làm việc khi một số cập nhật phá vỡ một cái gì đó).



3

Tôi đã có cùng một vấn đề với một dự án lớn với nhiều mô hình con. Dựa trên các câu trả lời của Chris Johnsen ở đâyVonC ở đây, tôi xây dựng một tập lệnh bash ngắn lặp đi lặp lại qua tất cả các mục gitlink hiện có và thêm chúng dưới dạng các mô hình con thích hợp.

#!/bin/bash

# Read all submodules in current git
MODULES=`git ls-files --stage | grep 160000`

# Iterate through every submodule path
while read -r MOD; do
  # extract submodule path (split line at whitespace and take string with index 3)
  ARRIN=(${MOD})
  MODPATH=${ARRIN[3]}

  # grep module url from .git file in submodule path
  MODURL=`grep "url = " $MODPATH/.git/config`
  MODURL=${MODURL##*=}

  # echo path and url for information
  echo $MODPATH
  echo $MODURL

  # remove existing entry in submodule index
  git rm --cached $MODPATH
  # add new entry in submodule index
  git submodule add $MODURL $MODPATH
done <<< "$MODULES"

Điều này đã sửa nó cho tôi, tôi hy vọng nó có ích gì.


2

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

git update-index --skip-worktree

Nếu nó không hoạt động với tên đường dẫn, 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á.

Tạm biệt!


1

Có cùng một vấn đề, nhưng nó đã không được giải quyết trong cuộc thảo luận này.

Tôi cũng nhấn vấn đề mô đun con như mô tả trong phần mở luồng.

% git status          
# On branch master
# Changes not staged for commit:
#   modified:   bundle/taglist (untracked content)

Nhìn vào diff tôi nhận ra một phần ba mươi được thêm vào một hàm băm: Đọc lại các tài liệu, giải quyết vấn đề cho tôi. http://web.mit.edu/jhawk/mnt/spo/git/git-doc/user-manual.html Xem phần "Cạm bẫy với mô hình con"

Lý do là, có những thay đổi hoặc nội dung không được theo dõi trong mô hình con. Trước tiên tôi phải vào thư mục mô đun con, thực hiện "git add" + "git commit" để có được tất cả nội dung được theo dõi trong mô hình con.

Then "git status" on the master stated
% git commit
# On branch master
# Changes not staged for commit:
#   modified:   bundle/taglist (new commits)

Bây giờ, phần đầu mới này từ mô hình con có thể được chuyển sang mô đun chủ.


1

Gần đây tôi đã gặp phải vấn đề này khi làm việc trong một dự án hợp đồng (được coi là phân loại). Hệ thống mà tôi phải chạy mã không có quyền truy cập internet, vì mục đích bảo mật, và vì vậy việc cài đặt các phụ thuộc, sử dụng trình soạn thảo và npm, đã trở thành nỗi đau lớn.

Sau nhiều lần cân nhắc với đồng nghiệp của mình, chúng tôi quyết định chỉ chắp cánh và sao chép dán phần phụ thuộc của chúng tôi thay vì cài đặt trình soạn thảo hoặc cài đặt npm.

Điều này khiến chúng tôi KHÔNG thêm nhà cung cấp và npm_modules trong gitignore. Đây là khi tôi gặp phải vấn đề này.

Changed but not updated:
modified:   vendor/plugins/open_flash_chart_2 (modified content, untracked content)

Tôi đã googled điều này một chút và tìm thấy chủ đề hữu ích này trên SO. Không quá chuyên nghiệp trong Git, và hơi say khi làm việc với nó, tôi chỉ tìm kiếm tất cả các mô hình con trong thư mục nhà cung cấp

find . -name ".git"

Điều này đã cho tôi khoảng 4-5 phụ thuộc có git vào chúng. Tôi đã xóa tất cả các thư mục .git và voila, nó đã hoạt động. Tôi biết đó là hack, và dù sao cũng không phải là một kẻ lập dị. Hỡi các vị thần của SO, xin hãy tha thứ cho tôi! Lần tới, tôi hứa sẽ đọc lên gitlinks và tuân theo Linus Tovalds hùng mạnh.


1

Câu hỏi này đã được trả lời, nhưng tôi nghĩ tôi sẽ thêm vào hỗn hợp những gì tôi phát hiện ra khi nhận được những tin nhắn này.

Tôi có một repo được gọi playgroundcó chứa một số ứng dụng hộp cát. Tôi đã thêm hai ứng dụng mới từ một hướng dẫn vào playgroundthư mục bằng cách nhân bản repo của hướng dẫn. Kết quả là các công cụ git của ứng dụng mới chỉ vào repo của hướng dẫn chứ không phải repo của tôi. Giải pháp là xóa .gitthư mục khỏi từng thư mục của các ứng dụng đó, thư mvmục của ứng dụng bên ngoài playgroundthư mục, sau đó mvchúng quay lại và chạy git add .. Sau đó nó hoạt động.


0

Trước tiên, hãy truy cập Danh mục : nhà cung cấp / plugin / open_flash_chart_2XÓA


SAU ĐÓ :

git rm --cached vendor/plugins/open_flash_chart_2  
git add .  
git commit -m "Message"  
git push -u origin master  

git status  

ĐẦU RA

Trên nhánh chính Chi nhánh
của bạn được cập nhật với 'origin / master'.
Không có gì để cam kết, thư mục làm việc sạch sẽ

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.