86

バックグラウンド

Linux で Git 1.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 - 無視

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

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

失敗 #5 - クローン

次のように book ディレクトリを master に追加しました。

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

質問

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

#
#       modified:   book (new commits)
#

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

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

4

6 に答える 6

61

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

$ 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ください。スーパーリポジトリの一部として状態を追跡する必要がない場合は、スーパーリポジトリ内にクローンを作成します。

于 2013-01-20T07:17:12.253 に答える
21

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

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

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
于 2014-10-21T09:47:23.197 に答える
10

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

OPの場合:

git config submodule.<name>.active false

commit 1b614c0、commit 1f8d711commit bb62e0acommit 3e7eaedcommit a086f92 (2017 年 3 月 17 日)、commit ee92ab9commit 25b31f1commit e7849a9commit 6dc9f01commit 5c2bd8b (2017 年 3 月 16 日) by Brandon Williamsをmbrandonw参照してください。
( 2017 年 3 月 30 日、コミット a93dcb0Junio C Hamanoによってマージされました)gitster

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

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

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

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

この目的のために、2 つの構成オプションが導入されsubmodule.activeて いますsubmodule.<name>.active

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

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

  1. サブモジュールは先頭のディレクトリでグループ化できます。たとえば ' lib/' などのパス指定がすべてのライブラリっぽいモジュールをカバーし、ライブラリっぽいモジュールに関心のある人が " submodule.active = lib/" を 1 回だけ設定して、' ' 内のすべてのモジュールlib/が面白い。
  2. pathspec-attribute 機能が発明されると、ユーザーはサブモジュールに属性のラベルを付けてグループ化:(attr:lib)できるようになり、' ' などの属性要件を持つ幅広いパス仕様を使用して、' ' 属性を持つすべてのモジュールlibが興味深いものであると言えます。
    ファイルは.gitattributesファイルと同様に.gitmodulesスーパープロジェクトによって追跡されるため、サブモジュールがスーパープロジェクト ツリー内を移動すると、プロジェクトは.gitattributesでサブモジュールを持つパスを調整できるのと同様に、 で属性を取得するパスを調整でき.gitmodulesます。
于 2017-04-16T17:53:44.393 に答える
2

Nevik Rehnel の回答は、確かにあなたが求めていることに対する正しい回答です.

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

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

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

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

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

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

于 2017-11-27T03:13:54.480 に答える
-5

走る

git submodule update 

ルートレベルで。

于 2014-01-30T22:53:06.317 に答える