1. ホーム
  2. git

[解決済み] git サブモジュールの新しいコミットを無視する

2023-05-29 19:48:25

質問

背景

Linux で Git 1.8.1.1 を使用しています。リポジトリは以下のような感じです。

master
  book

サブモジュールは以下のように作成されました。

$ cd /path/to/master
$ git submodule add https://[email protected]/user/repo.git book

book サブモジュールはクリーンです。

$ cd /path/to/master/book/
$ git status
# On branch master
nothing to commit, working directory clean

問題点

一方、master では、book サブモジュールに対して "新規コミット" が存在することがわかります。

$ cd /path/to/master/
$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   book (new commits)
#
no changes added to commit (use "git add" and/or "git commit -a")

Gitはサブモジュールディレクトリを完全に無視し、masterもきれいになるようにする必要があります。

$ cd /path/to/master/
$ git status
# On branch master
nothing to commit, working directory clean

失敗した試み1 - 汚い

ファイル内部 master/.gitmodules は、以下のように、このように 答え :

[submodule "book"]
        path = book
        url = https://[email protected]/user/repo.git
        ignore = dirty

失敗した試み2 - 追跡されない

変更された master/.gitmodules を次のように、このように 答え :

[submodule "book"]
        path = book
        url = https://[email protected]/user/repo.git
        ignore = untracked

失敗した試み3 - showUntrackedFiles

編集 master/.git/config を次のように、このように 答え :

[status]
   showUntrackedFiles = no

失敗した試行その4 - 無視

bookディレクトリをマスター無視ファイルに追加しました。

$ cd /path/to/master/
$ echo book > .gitignore

失敗例5 - クローン

以下のように、bookディレクトリをマスターに追加しました。

$ cd /path/to/master/
$ rm -rf book
$ git clone https://[email protected]/user/repo.git book

質問

どのようにすれば book サブモジュールは、独自のリポジトリディレクトリで master リポジトリにあるにもかかわらず、git が book サブモジュールを無視しますか?つまり、以下は表示されないはずです。

#
#       modified:   book (new commits)
#

を実行するときに、そのメッセージを表示しないようにするにはどうしたらよいでしょうか。 git status を実行したときにこのメッセージを表示しないようにするにはどうしたらよいでしょうか?

に関する記事 git サブモジュールの落とし穴 という記事は、サブモジュールの使い方として不適切ではないでしょうか?

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

スーパーレポで追跡する必要のない別のリポジトリを含めるには、次の方法を試してください。

$ cd /path/to/master/
$ rm -rf book
$ git clone https://[email protected]/user/repo.git book
$ git add book
$ echo "book" >> .gitignore

次にコミットします。

リンク先の git submodule pitfalls の記事で述べられています。 :

... 親とサブモジュールの間の唯一の結びつきは、親のコミットに保存されているサブモジュールのチェックアウトされた SHA の記録値 [のみ] です。

つまり、サブモジュールはチェックアウトされたブランチやタグによってではなく、常に特定のコミットによって保存されます。そのコミット (SHA) は通常のテキストファイルのようにスーパーレポ (サブモジュールを含むもの) に保存されます (もちろん、その参照としてマーキングされます)。

別のコミットをチェックアウトするとき をチェックアウトすると、サブモジュール内の をチェックアウトしたり、その中で新しいコミットをすると、スーパーレポはチェックアウトされたSHAが変更されたことを確認します。そのときに modified (new commits) の行が git status .

それを解消するためには、どちらかというと

コメントで言及されたように、放棄することを検討してください。 book サブモジュールを放棄することを検討してください。スーパーレポの一部としてその状態を追跡することが必要でない場合、スーパーレポの内部でそれをクローンしてください。