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
ファイル内のmaster/.gitmodules
は、次のとおりです answer :
[submodule "book"]
path = book
url = https://[email protected]/user/repo.git
ignore = dirty
このようにmaster/.gitmodules
を次のように変更しました answer :
[submodule "book"]
path = book
url = https://[email protected]/user/repo.git
ignore = untracked
この answer に従って、master/.git/config
を次のように編集しました。
[status]
showUntrackedFiles = no
ブック無視ディレクトリをマスター無視ファイルに追加しました。
$ cd /path/to/master/
$ echo book > .gitignore
次のように、ブックディレクトリをマスターに追加しました。
$ 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 に関する記事は、これが不適切なサブモジュールの使用を示唆していますか?
スーパーリポジトリで追跡する必要のない別のリポジトリを含めるには、これを試してください:
_$ 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
サブモジュールを放棄することを検討してください。スーパーリポジトリの一部としてその状態を追跡する必要がない場合は、スーパーリポジトリ内で複製します。
ただ走れ:
$ git submodule update
これは、サブモジュールを最新バージョンのサブモジュールで更新せずに、サブモジュールを古いコミット(parent-repoで指定)に戻します。
抑制できる変更通知には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
Git 2.13(2017年第2四半期)には、親リポジトリで追跡する必要のないサブモジュールを含める別の方法が追加されます。
OPの場合:
git config submodule.<name>.active false
commit 1b614c 、 commit 1f8d711 、 commit bb62e0a 、 commit 3e7eaed 、 commit 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.active
とsubmodule.<name>.active
の2つの設定オプションが導入されています。
submodule.active
configには、作業ツリーに存在するサブモジュールを指定するpathspecが保持されます。
submodule.<name>.active
configは、特定のサブモジュールが作業ツリーに存在する必要があるかどうかを示すために使用されるブールフラグです。
submodule.active
は、pathspecを使用するため、他の構成オプションとは異なる機能を持つことに注意することが重要です。
これにより、ユーザーは少なくとも2つの新しいワークフローを採用できます。
- サブモジュールは、pathspecなどの主要なディレクトリでグループ化できます。 「
lib/
」はすべてのライブラリー風のモジュールをカバーし、ライブラリー風のモジュールに興味のある人が「submodule.active = lib/
」を一度だけ設定して、「lib/
」のすべてのモジュールが面白いと言うことができます。- Pathspec-attribute機能が発明されると、ユーザーはサブモジュールに属性を付けてグループ化することができます。 「
:(attr:lib)
」は、「lib
」属性を持つすべてのモジュールが興味深いことを示すために使用できます。.gitattributes
ファイルと同様に、.gitmodules
ファイルはスーパープロジェクトによって追跡されるため、サブモジュールがスーパープロジェクトツリー内を移動すると、プロジェクトはどのパスを調整するかのように、.gitattributes
の属性を取得するパスを調整できます.gitmodules
にサブモジュールがあります。
Nevik Rehnelの答えは、あなたが尋ねているものに対して確かに正しいものです:サブモジュールを持ちたくありませんでした、どうすればその状況から抜け出すことができますか?!。
master
プロジェクトにbook
サブモジュールが必要な場合にのみ、プロジェクトをチェックアウトする他のユーザーが特別なgit
コマンドを実行する(まあ...サブモジュールを使用するための特別なコマンドがいくつかありますが、全体的には管理が簡単だと思います。)
あなたの場合、book
リポジトリに変更を加え、ある時点でそれらの変更をコミットします。これは、そのサブモジュールに新しいコミットがあり、新しいSHA1参照があることを意味します。
マスターディレクトリで行う必要があるのは、マスターリポジトリでこれらの変更をコミットすることです。
cd /path/to/master
git commit . -m "Update 'book' in master"
これにより、master
のSHA1参照がbook
リポジトリで利用可能な最新バージョンに更新されます。その結果、このコミットにより、他のユーザーがすべてのmaster
&book
リポジトリをチェックアウトできます。
したがって、実際には、サブモジュールに変更を加えるたびに、もう1つのコミットが行われます。同時に両方をコミットするため、master
リポジトリ内のいくつかのファイルにも変更を加えると、半透明になります。