私には大きなプロジェクトがあります(たとえば[A repo
])、B repo
から派生した1つの子フォルダーがあります。 A repo
からコミットすると、次のような警告が表示されます。
warning: adding embedded git repository: extractor/annotator-server
hint: You've added another git repository inside your current repository.
hint: Clones of the outer repository will not contain the contents of
hint: the embedded repository and will not know how to obtain it.
hint: If you meant to add a submodule, use:
hint:
hint: git submodule add <url> extractor/annotator-server
hint:
hint: If you added this path by mistake, you can remove it from the
hint: index with:
hint:
hint: git rm --cached extractor/annotator-server
hint:
hint: See "git help submodule" for more information.
git-submodule
とgit-subtree
を見ました:
https://www.atlassian.com/blog/git/alternatives-to-git-submodule-git-subtree
しかし、追加の設定が必要なので、私はそれらが好きではありません。
私が欲しいのは、例えば:
次のような構造:
A/
--- a.py
--- B/
--- B/b.py
B/b.py
を変更したとき。
パスA/
にいる場合、git add
はB/b.py
の変更を検出でき、git Push
はそれをAリポジトリにコミットするだけです。
git add . (would add changes under A/ )
git Push (would Push changes under A/ )
git pull (would pull changes under A/ )
git clone XXX:A (would clone all files under A/ , A/B/ is just looks like plain folder with all files, not a repo )
パスA/B/
にいる場合、git add
はBリポジトリにB/b.py
変更のみを追加し、git Push
はBリポジトリにのみコミットします。
git add . (would add changes under B/ , but not add changes to A repo)
git Push (would Push changes under B/ , but not Push changes to A repo)
git pull (would clone changes under B/ , )
git clone XXX:B (would clone all files under B/ )
別のマシンでAとBをsnycしたい場合は、
git clone A
rm -rf A/B/
git clone B ./B
git add . && git commit 'sync with B'
別のWordでは、AとBはスタンドアロンリポジトリとして機能します。
しかし、真実は、AレポはBレポをサブモジュールとして扱います:
リポジトリ https://github.com/eromoe/test
Bリポジトリ https://github.com/eromoe/test2
AリポジトリがA/
の下のすべてのファイルを追跡し、BリポジトリがA/B/
の下のすべてのファイルを追跡するにはどうすればよいですか? AとBは、他の設定なしで、自己完結型のレポとして機能します。
以下のコマンドを使用して、test2リポジトリからファイルを追加して、以下のようにリポジトリをテストできます。
# In local test repo
rm -rf test2
git clone https://github.com/eromoe/test2
git add test2/
git commit -am 'add files from test2 repo to test repo'
git Push
注:
git add test2/
(git add test2
ではなくスラッシュを使用)を使用する必要があります。
git add test2/
はtest2
フォルダーとそのファイルを通常のフォルダーおよびテストリポジトリ用のファイルとして作成します(作成モード100644
)。
git add test2
は、test2
フォルダーをテストリポジトリ(作成モード160000
)のサブモジュールとして扱います。
おそらく、gitはリポジトリを思い出させました。それは私を助けました:
git rm --cached your_folder_with_repo git commit -m "キャッシュされたレポを削除" git add your_folder_with_repo / git commit -m "フォルダーの追加" git Push
B Aが使用している正確なバージョンを気にしない場合は、現在の設定を保持できます(ネストされたgitリポジトリ)。
「埋め込みリポジトリ」警告が表示されますが、それ以外に、両方のリポジトリが期待どおりに動作し、それぞれがリポジトリのみを追加、コミット、プッシュします。
注: git config advice.addEmbeddedRepo