163

私の元の質問については、実線の下を参照してください。

ローカルディレクトリに追跡されていないフォルダがあります。実行するgit statusと、次のようになります。

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

入力してから再git add vendor/plugins/open_flash_chart_2試行git statusすると、まだ追跡されていないと表示されます。どうしたの?


これが私の最近の30分の簡単な要約です:

  • Githubリポジトリがvendor/plugins/open_flash_chart_2プラグインを追跡していないことを発見しました。具体的には、コンテンツがなく、フォルダアイコンに緑色の矢印が表示されています。

  • 試してみましたgit submodule init

    No submodule mapping found in .gitmodules for path '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

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

    modified: vendor/plugins/open_flash_chart_2 (untracked content)
    
  • リポジトリ/ローカルディレクトリで名前が付けられたファイル.gitmodulesを探しましたが、見つかりませんでした。

gitが適切に追跡を開始できるように、サブモジュールを機能させるにはどうすればよいですか?


git commit -aこれは無関係かもしれませんが(役立つ場合に備えて含めます)、通常ではなく入力するたびにgit commit -m "my comments"エラーが発生します。

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:

私はGithubの完全な初心者であり、ドキュメントを調べようとしているにもかかわらず、これらの特定の問題に少し困惑しています。ありがとうございました。

4

14 に答える 14

243

vendor/plugins/open_flash_chart_2「gitlink」エントリとして追加しましたが、サブモジュールとして定義したことはありません。事実上、 git サブモジュールが使用する内部機能(gitlink エントリ) を使用していますが、サブモジュール機能自体は使用していません。

あなたはおそらく次のようなことをしました:

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

この最後のコマンドが問題です。ディレクトリvendor/plugins/open_flash_chart_2は、独立した Git リポジトリとして開始されます。通常、そのようなサブリポジトリは無視されますが、明示的に追加するようにgit addに指示すると、ディレクトリの内容を追加する代わりに、サブリポジトリの HEAD コミットを指す gitlink エントリが作成されます。git addがそのような「セミサブモジュール」の作成を拒否してくれるとよいのですが。

通常のディレクトリは、Git ではツリー オブジェクトとして表されます。ツリー オブジェクトは、含まれるオブジェクト (通常は他のツリー オブジェクトと BLOB オブジェクト (それぞれディレクトリとファイル)) に名前とアクセス許可を与えます。サブモジュールは「gitlink」エントリとして表されます。gitlink エントリには、サブモジュールの HEAD コミットのオブジェクト名 (ハッシュ) のみが含まれます。gitlink のコミットの「ソース リポジトリ」は、.gitmodulesファイル (および.git/configサブモジュールが初期化された後のファイル) で指定されます。

あなたが持っているのは、そのコミットのソースリポジトリを記録せずに、特定のコミットを指すエントリです。これを修正するには、gitlink を適切なサブモジュールにするか、gitlink を削除して「通常の」コンテンツ (プレーン ファイルとディレクトリ) に置き換えます。

適切なサブモジュールに変換する

vendor/plugins/open_flash_chart_2サブモジュールとして適切に定義するために欠けている唯一のビットは.gitmodulesファイルです。通常(裸の gitlink エントリとしてまだ追加していない場合)、次を使用しますgit submodule add

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

ご覧のとおり、パスがインデックスに既に存在する場合、これは機能しません。解決策は、インデックスから gitlink エントリを一時的に削除してから、サブモジュールを追加することです。

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

これにより、既存のサブリポジトリが使用され (つまり、ソース リポジトリの再クローンは作成されません)、.gitmodules次のようなファイルがステージングされます。

[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

メインリポジトリにも同様のエントリが作成されます.git/config(path設定なし)。

それをコミットすると、適切なサブモジュールができます。リポジトリをクローンする (または GitHub にプッシュしてそこからクローンする) と、サブモジュールを 経由で再初期化できるはずですgit submodule update --init

プレーンコンテンツに置き換える

vendor/plugins/open_flash_chart_2次のステップでは、保存したいローカル履歴がサブリポジトリにないことを前提としています(つまり、関心があるのは、履歴ではなく、サブリポジトリの現在の作業ツリーだけです)。

サブリポジトリに関心のあるローカル履歴がある場合は、サブリポジトリの.gitディレクトリをバックアップしてから、以下の 2 番目のコマンドで削除する必要があります。(サブリポジトリの HEAD の履歴を保存する以下のgit サブツリーの例も考慮してください)。

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

今回のディレクトリ追加時はサブリポジトリではないので、普通にファイルが追加されます。残念ながら、.gitディレクトリを削除したため、ソース リポジトリを最新の状態に保つための非常に簡単な方法はありません。

代わりに、サブツリー マージの使用を検討してください。そうすることで、リポジトリ内でファイルを「フラット」に保ちながら (サブモジュールなしで)、ソース リポジトリから簡単に変更を取り込むことができます。サードパーティのgit subtreeコマンドは、サブツリーのマージ機能の優れたラッパーです。

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

後で:

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 subtree--squashには、ソース リポジトリの履歴を履歴に組み込むことを回避できるオプションもありますが、アップストリームの変更を取り込むことはできます。

于 2010-11-12T08:06:31.423 に答える
114

私はちょうど同じ問題を抱えていました。その理由は、「.git」フォルダーを含むサブフォルダーがあったためです。それを削除すると、gitが幸せになりました。

于 2011-05-05T13:02:29.877 に答える
6

OPとのChris Johansenのチャットから掘り下げなければならなかったことを指摘するには(返信から回答へのリンク):

git add vendor/plugins/open_flash_chart_2# gitlink を追加しますが、コンテンツは追跡されません

git add vendor/plugins/open_flash_chart_2/# スラッシュに注意!!!!

2 番目のフォームは gitlink なしで追加し、コンテンツは追跡可能です。.git ディレクトリは便利で自動的に無視されます。ありがとうクリス!

于 2013-08-23T02:03:12.500 に答える
3

http://progit.org/book/ch6-6.html

サブモジュールについて少し学ぶためにこれを読むべきだと思います。それはよく書かれていて、それを読むのにそれほど時間はかかりません。

于 2010-11-12T03:08:15.800 に答える
1

私は最近、契約プロジェクト(機密扱いとみなされる)に取り組んでいるときにこの問題に遭遇しました。私がコードを実行しなければならなかったシステムは、もちろんセキュリティ上の理由からインターネットにアクセスできませんでした。

同僚とよく話し合った結果、 composer install や npm install を実行するのではなく、単に wing を使用して依存関係をコピー ペーストすることにしました。

これにより、ベンダーと npm_modules を gitignore に追加しないようになりました。これは、私がこの問題に遭遇したときです。

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

私はこれを少しグーグルで検索し、SOでこの役立つスレッドを見つけました。Git の専門家というわけではなく、それに取り組んでいる間は少し酔っていたので、vendors フォルダー内のすべてのサブモジュールを検索しました。

find . -name ".git"

これにより、git が含まれる 4 ~ 5 個の依存関係が得られました。これらの .git フォルダーをすべて削除すると、うまくいきました。私はそれがハックであることを知っていますが、とにかく非常にマニアックなものではありません. SOの神々よ、私を許してください!次回は gitlinks を読んで、偉大な Linus Tovalds に従うことを約束します。

于 2016-02-08T19:14:32.013 に答える
1

同じ問題がありましたが、このディスカッションでは解決されませんでした。

スレッドの冒頭で説明されているように、サブモジュールの問題にも遭遇しました。

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

diff を見ると、ハッシュに -dirty が追加されていることがわかりました。ドキュメントをもう一度読むと、問題が解決しました。 http://web.mit.edu/jhawk/mnt/spo/git/git-doc/user-manual.html セクション「サブモジュールの落とし穴」を見てください

理由は、サブモジュール内に変更または追跡されていないコンテンツがあったためです。最初にサブモジュール ディレクトリに移動し、「git add」+「git commit」を実行して、サブモジュール内で追跡されるすべてのコンテンツを取得する必要がありました。

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

これで、サブモジュールからのこの新しい HEAD をマスター モジュールにコミットできます。

于 2012-08-17T15:08:27.510 に答える