私の元の質問については、下の実線を参照してください。
ローカル ディレクトリに追跡されていないフォルダーがあります。 を実行すると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 の完全な初心者で、ドキュメントを読んだにもかかわらず、これらの特定の問題に少し困惑しています。ありがとうございます。
ベストアンサー1
「gitlink」エントリとして追加しましたがvendor/plugins/open_flash_chart_2
、サブモジュールとして定義されていません。実際には、内部機能を使用しています。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 追加明示的に追加すると、ディレクトリの内容を追加する代わりに、サブリポジトリのHEADコミットを指すgitlinkエントリが作成されます。git 追加このような「セミサブモジュール」の作成を拒否します。
通常のディレクトリは 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 番目のコマンドで削除する前に、サブリポジトリのディレクトリをバックアップする必要があります。(また、git サブツリー以下に、サブリポジトリの HEAD の履歴を保持する例を示します。
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 サブツリー指示サブツリーのマージ機能をラップする優れたラッパーです。
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 [email protected]:me/my_ofc2_fork.git changes_for_pull_request
git サブツリーまた、--squash
ソース リポジトリの履歴を自分の履歴に組み込まないようにしながらも、アップストリームの変更をプルできるようにするオプションもあります。