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


83

バックグラウンド

LinuxでGit1.8.1.1を使用する。リポジトリは次のようになります。

master
  book

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

$ cd /path/to/master
$ git submodule add https://user@bitbucket.org/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この回答によると、ファイル内には次のものがあります。

[submodule "book"]
        path = book
        url = https://user@bitbucket.org/user/repo.git
        ignore = dirty

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

master/.gitmodulesこの回答に従って、次のように変更されました:

[submodule "book"]
        path = book
        url = https://user@bitbucket.org/user/repo.git
        ignore = untracked

失敗した試行#3-showUntrackedFiles

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://user@bitbucket.org/user/repo.git book

質問

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

#
#       modified:   book (new commits)
#

git statusマスターリポジトリで実行するときにそのメッセージを抑制する方法は?

gitサブモジュールの落とし穴に関する記事は、これが不適切なサブモジュールの使用法であることを示唆していますか?


3
リポジトリを別のリポジトリの特定のバージョンにリンクし、それを追跡する場合は、通常、サブモジュールを使用します。しかし、それはあなたが望んでいることではないようです。リポジトリを追跡せずに、別のリポジトリ内で使用したいだけです。その場合、サブモジュールとして追加しないでください。
Felix Kling 2013年

@FelixKling、そのようなリポジトリをそのように追加してGitHubにプッシュすると、そのフォルダーのコンテンツをコピーせずに、そのリポジトリへのリンクだけが作成されますか?
ローマンベッキエフ2013年

@Roland:サブモジュールは、他のリポジトリのバージョンへの参照を含む単なるファイルです。リポジトリのローカルコピーで初期化されると、リポジトリの実際のコンテンツに置き換えられます。
Felix Kling 2013年

2
あなたは「無視=すべて」を探していると思います
2014年

1
Git 2.13(2017年第2四半期)を使用すると、を検討できるようになりますgit config submodule.<name>.active false以下の私の答えを
VonC 2017

回答:


60

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

$ cd /path/to/master/
$ rm -rf book
$ git clone https://user@bitbucket.org/user/repo.git book
$ git add book
$ echo "book" >> .gitignore

次にコミットします。

リンクされたgitサブモジュールの落とし穴の記事で述べられているように:

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

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

サブモジュールで別のコミットをチェックアウトするか、サブモジュールで新しいコミットを行うと、スーパーリポジトリはチェックアウトされたSHAが変更されたことを確認します。それはあなたがからmodified (new commits)行を取得するときですgit status

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

  • git submodule update、サブモジュールを現在スーパーリポジトリに保存されているコミットにリセットします(詳細については、git submoduleマンページを参照してください;または
  • git add book && git commit 新しいSHAをスーパーレポに保存します。

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


3
わあ、今私は、スーパーモジュールがサブモジュールのバージョンを知る必要がある理由を理解しました。もちろん、それは理にかなっていますgit add book && git commit。gitが実際に2つのリポジトリが同期していることを確認できることに気づいていませんでした。
Sergey Orshanskiy 2016

103

とにかく走れ:

$ git submodule update

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


6
いいえ、そうではありません。ステータスは変更されません。
エドビショップ

OPがリポジトリから最新のものを入手したくないのはなぜbookですか?この文脈では、あなたの答えは意味をなさないと思います。
Alexis Wilke 2017年

@AlexisWilkeと、ブックインターフェイスが劇的に変化し、OPにマスターリポジトリを変更する時間がない場合はどうなりますか?
ログマン2017

これが私が探していた答えです!
LLSv2.0

21

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

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

modified: book (untracked content)

これらは次のように抑制できます:

[submodule "book"]
    path = modules/media
    url = https://user@bitbucket.org/user/repo.git
    ignore = dirty

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

modified:   book (new commits)

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

[submodule "book"]
    path = book
    url = https://user@bitbucket.org/user/repo.git
    ignore = all

ignore = allすべてのサブモジュールにオプションを追加したと想像してください。最終的に、一部のモジュールには、プッシュされた新しいコミットがあります。その後、誰かがスーパーリポジトリのクローンを作成した場合、それはサブモジュールの古い状態になりますか、それとも最新のものをチェックアウトしますか?
felikZ 2015年

このコマンドgit clone --recursive git@...を使用すると、サブモジュールの古い状態を取得できます。それらを更新するには、git submodule foreach "git pull"クローン作成後のようなものが必要になります
2015年

1
残念ながら、ignore = allオプションはサブモジュールの新しいコミットを無視しません。gitバージョン1.7.1を実行しています。何かアイデアはありますか?
ロムルス2017年

10

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

OPの場合:

git config submodule.<name>.active false

参照1b614c0をコミットし1f8d711をコミットしbb62e0aをコミットし3e7eaedをコミットしa086f92をコミット(2017年3月17日)、およびee92ab9をコミットし25b31f1をコミットしe7849a9をコミットし6dc9f01をコミットし5c2bd8bをコミットすることで(2017年3月16日)(ブランドン・ウィリアムズmbrandonw
(合併によりJunio C浜野- gitster-a93dcb0コミット、2017年3月30日)

submodule:URLとサブモジュールの関心を切り離す

現在、submodule.<name>.urlconfigオプションは、特定のサブモジュールがユーザーに関心があるかどうかを判断するために使用されています。これは、さまざまなワークツリーでさまざまなサブモジュールをチェックアウトしたり、関心のあるサブモジュールを選択するためのより一般化されたメカニズムを使用したりする世界では、厄介なことになります。

サブモジュールのワークツリーサポートが将来的には、複数の作業ツリーがあり、それぞれがサブモジュールのサブセットのみをチェックアウトする必要がある場合があります。
URL(サブモジュールリポジトリを取得できる場所)は、異なる作業ツリー間で異なってはなりません。

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

この目的を達成するために、2つの設定オプションを導入し、されているsubmodule.activesubmodule.<name>.active

  • 構成submodule.activeは、作業ツリーに存在するサブモジュールを指定するpathspecを保持します。
    • ザ・ submodule.<name>.active設定は、その特定のサブモジュールは、作業ツリー内に存在するかどうかを示すために使用するブールフラグです。

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

  1. サブモジュールは、pathspec eg 'のように先頭のディレクトリとグループ化できます。lib/」「セットにライブラリっぽいモジュールに関心のある人たちを可能にするために、すべてのライブラリっぽいモジュールをカバーするsubmodule.active = lib/に任意およびすべてのモジュールを言うために一度だけ」「lib/」は、面白い。
  2. pathspec-attribute機能が発明されると、ユーザーはサブモジュールに属性のラベルを付けてグループ化できるため、属性要件のある幅広いpathspecを:(attr:lib)使用して、 ' lib'属性を持つすべてのモジュールが興味深いと言うことができます。ファイルは
    .gitattributesファイルと同様に.gitmodulesスーパープロジェクトによって追跡されるため、サブモジュールがスーパープロジェクトツリー内を移動すると、プロジェクト.gitattributesは、サブモジュールを持つパスを調整できるのと同じように、属性を取得するパスを調整でき.gitmodulesます。

<name>既存のプロジェクトのサブモジュールの正確なものを見つける方法は?
ideasman42

@ ideasman42 .gitmodulesの設定を読むと役立つはずです:stackoverflow.com/a/12641787/6309
VonC 2017年

ああ、それはわずか値だ.git/config> -[submodule "<name>"]
ideasman42

1
私には効かない。これが私がすることです:1)-recursiveを使用したgit clone; 2)gitconfigを回答として設定します。3)git checkoutを実行し、gitpullを実行して最後のサブモジュールをチェックアウトします。それでも「(新しいコミット)」を取得します。
Wu Baiquan 2018年

2
@VonCメッセージを送る前に、両方を試しました(既存のリポジトリと新しい初期化されたリポジトリを使用)。どちらの場合も機能しませんでした。
ヤマアラシ

3

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

masterプロジェクトにbookサブモジュールが必要な場合にのみ、プロジェクトをチェックアウトする他のユーザーがgit実行する特別なコマンドがないことを楽しむことができるので、サブモジュールをそのままにしておくのは良いジェスチャーです(まあ...使用する特別なコマンドがいくつかありますサブモジュールですが、全体として、管理はさらに簡単だと思います。)

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

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

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

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

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


-5

実行

git submodule update 

ルートレベルで。


疑問に思っている人のためだけに。私の場合(そしてOP?)、これは何をgit status言うかを変えません。それはまだ変化が起こったと考えています。
squarism 2015年

他の人の答えを複製することは非常に悪い習慣です
マキシム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.