web-dev-qa-db-ja.com

gitサブモジュールの新しいコミットを無視する

バックグラウンド

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

問題

一方、マスターは、ブックサブモジュールの「新しいコミット」があることを示しています。

$ 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はサブモジュールディレクトリを完全に無視する必要があるため、マスターもクリーンになります。

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

失敗した試行#1-ダーティ

ファイル内のmaster/.gitmodulesは、次のとおりです answer

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

失敗した試行#2-追跡されていない

このようにmaster/.gitmodulesを次のように変更しました answer

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

失敗した試行#3-showUntrackedFiles

この answer に従って、master/.git/configを次のように編集しました。

[status]
   showUntrackedFiles = no

失敗した試行#4-無視

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

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

失敗した試行#5-クローン

次のように、ブックディレクトリをマスターに追加しました。

$ 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 submodule pitfalls に関する記事は、これが不適切なサブモジュールの使用を示唆していますか?

72
Dave Jarvis

スーパーリポジトリで追跡する必要のない別のリポジトリを含めるには、これを試してください:

_$ 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 article

...親とサブモジュール間の唯一のリンクは、[the]記録されたサブモジュールのチェックアウトの値SHAであり、これは親のコミットに格納されます。

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

サブモジュールで別のコミットをチェックアウトするか、その中に新しいコミットを作成すると、スーパーリポジトリはそのチェックアウトSHA _git status_からmodified (new commits)行を取得するときです。

これを解消するには、次のいずれかを実行できます。

  • _git submodule update_、これは、スーパーモジュールに現在保存されているコミットにサブモジュールをリセットします(詳細については the _git submodule_ manpage ;または
  • _git add book && git commit_は、新しいSHAをスーパーリポジトリに保存します。

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

55
Nevik Rehnel

ただ走れ:

$ git submodule update

これは、サブモジュールを最新バージョンのサブモジュールで更新せずに、サブモジュールを古いコミット(parent-repoで指定)に戻します。

93
Shiv Kumar

抑制できる変更通知には2種類あります(git 1.7.2以降)。

1つ目は、サブモジュールに変更を加えたがまだコミットしていないときに発生する未追跡のコンテンツです。親リポジトリはこれらに気づき、それに応じてgit statusが報告します:

modified: book (untracked content)

これらを抑制するには:

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

ただし、これらの変更をコミットすると、親リポジトリは再び通知を受け取り、それに応じてレポートします。

modified:   book (new commits)

これらも抑制したい場合は、すべての変更を無視する必要があります

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

Git 2.13(2017年第2四半期)には、親リポジトリで追跡する必要のないサブモジュールを含める別の方法が追加されます。

OPの場合:

git config submodule.<name>.active false

commit 1b614ccommit 1f8d711commit bb62e0acommit 3e7eaedcommit a086f92 を参照してください(2017年3月17日)、および コミットee92ab9コミット25b31f1コミットe7849a9コミット6dc9f01コミット5c2bd8b (2017年3月16日)by Brandon Williams(mbrandonw .
ジュニオC浜野-gitster- in commit a93dcb 、2017年3月30日)

submodule:URLとサブモジュールのインタレストを分離します

現在、submodule.<name>.url configオプションは、特定のサブモジュールがユーザーの関心を引くかどうかを判断するために使用されます。これは、異なるサブツリーを異なるワークツリーにチェックアウトしたい場合や、より一般的なメカニズムで関心のあるサブモジュールを選択したい場合には面倒です。

将来、サブモジュールのワークツリーサポートにより、複数の作業ツリーが存在し、それぞれがチェックアウトされたサブモジュールのサブセットのみを必要とする可能性があります。
URL(サブモジュールリポジトリを取得できる場所)は、異なる作業ツリー間で異なる必要があります。

また、作業ツリーでチェックアウトする各サブモジュールで「git submodule init <path>」を実行するのではなく、ユーザーが関心のあるサブモジュールのグループをより簡単に指定できると便利です。

このために、submodule.activesubmodule.<name>.activeの2つの設定オプションが導入されています。

  • submodule.active configには、作業ツリーに存在するサブモジュールを指定するpathspecが保持されます。
    • submodule.<name>.active configは、特定のサブモジュールが作業ツリーに存在する必要があるかどうかを示すために使用されるブールフラグです。

submodule.activeは、pathspecを使用するため、他の構成オプションとは異なる機能を持つことに注意することが重要です。
これにより、ユーザーは少なくとも2つの新しいワークフローを採​​用できます。

  1. サブモジュールは、pathspecなどの主要なディレクトリでグループ化できます。 「lib/」はすべてのライブラリー風のモジュールをカバーし、ライブラリー風のモジュールに興味のある人が「submodule.active = lib/」を一度だけ設定して、「lib/」のすべてのモジュールが面白いと言うことができます。
  2. Pathspec-attribute機能が発明されると、ユーザーはサブモジュールに属性を付けてグループ化することができます。 「:(attr:lib)」は、「lib」属性を持つすべてのモジュールが興味深いことを示すために使用できます。
    .gitattributesファイルと同様に、.gitmodulesファイルはスーパープロジェクトによって追跡されるため、サブモジュールがスーパープロジェクトツリー内を移動すると、プロジェクトはどのパスを調整するかのように、.gitattributesの属性を取得するパスを調整できます.gitmodulesにサブモジュールがあります。
9
VonC

Nevik Rehnelの答えは、あなたが尋ねているものに対して確かに正しいものです:サブモジュールを持ちたくありませんでした、どうすればその状況から抜け出すことができますか?!

masterプロジェクトにbookサブモジュールが必要な場合にのみ、プロジェクトをチェックアウトする他のユーザーが特別なgitコマンドを実行する(まあ...サブモジュールを使用するための特別なコマンドがいくつかありますが、全体的には管理が簡単だと思います。)

あなたの場合、bookリポジトリに変更を加え、ある時点でそれらの変更をコミットします。これは、そのサブモジュールに新しいコミットがあり、新しいSHA1参照があることを意味します。

マスターディレクトリで行う必要があるのは、マスターリポジトリでこれらの変更をコミットすることです。

cd /path/to/master
git commit . -m "Update 'book' in master"

これにより、masterのSHA1参照がbookリポジトリで利用可能な最新バージョンに更新されます。その結果、このコミットにより、他のユーザーがすべてのmasterbookリポジトリをチェックアウトできます。

したがって、実際には、サブモジュールに変更を加えるたびに、もう1つのコミットが行われます。同時に両方をコミットするため、masterリポジトリ内のいくつかのファイルにも変更を加えると、半透明になります。

1
Alexis Wilke