1. ホーム
  2. git

[解決済み] 未追跡のコンテンツを追跡する方法は?

2022-04-25 23:39:46

質問

最初の質問は、実線の下をご覧ください。

ローカルディレクトリに追跡されていないフォルダがあります。私が 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の全くの初心者で、ドキュメントに目を通そうとしても、これらの特定の問題で少しつまづいています。ありがとうございます。

どのように解決するのですか?

を追加しました。 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 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 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

ギットサブツリー もまた --squash オプションを使用すると、ソースリポジトリの履歴を自分の履歴に取り込まないようにできますが、それでも上流の変更を取り込むことはできます。