Sourcetree でリポジトリをチェックアウトまたはプルして、サブモジュールの有無が有→無に変わる場合に、サブモジュールのファイルが残ってしまいます。
例:
repo_parent の配下にサブモジュール repo_sub が存在しています。
repo_parent
.git
modules
repo_sub ... (A)
config ... (B)
.gitmodules ... (C)
repo_sub ... (1)
.git ... (2)
directory ... (3)
file.txt
file_of_sub.txt ... (4)
file_of_parent.txt
チェックアウトして repo_sub が存在しないリビジョンにチェックアウトすると、以下の結果となります
(A)のディレクトリ:削除されない ×
(B)の当該管理情報:削除されない ×
(C)の当該管理情報:削除される 〇
(1)のディレクトリ:削除されない ×
(2)のファイル(管理情報):削除されない ×
(3)のディレクトリ及び配下のファイル:削除されない ×
(4)のファイル:削除されない ×
以下の質問にご回答頂けないでしょうか?
(1)以下の課題に該当するかと思いますが、本問題を修正する予定はないでしょうか?
https://jira.atlassian.com/browse/SRCTREEWIN-1330
(2)プル/チェックアウト時に正常に動作させるような手順、コマンドは存在しないでしょうか?
(3)(2)を実現するコマンドを実装できたとして、Sourcetree のカスタムコマンドで呼び出すことはできないでしょうか?
チェックアウト時は可能だと思いますが、プル時は難しいのではないかと考えています。
こんにちは、アトラシアンの山本です。
言及いただいた SRCTREEWIN-1330 はコメント内で git そのものの動作であるとの説明がなされているようです。恐縮ながら私の手元で同様の再現環境を用意できていないのですが SourceTree でなく git コマンドのみで submodule を管理した場合に同様の動作となるかご確認いただけますでしょうか。
ご回答ありがとうございます。
Sourcetree がリポジトリへの操作を行う際は、実際には 1つ以上のコマンドに展開されている(git コマンドの呼び出し含む)ので、そのコマンドをそのままなぞると同じ結果となります。
サブモジュールの挙動は git コマンド自体でも少し怪しい(よく知ったうえで適切な操作を行う必要がある)ところもありますが、その怪しさを Sourcetree で吸収してくれるかどうかの製品上のポリシーにも関係していると思います。
git のコマンドは (A)の管理情報を概ね削除しないようです。
〇本投稿の場合(チェックアウト/プル時)
チェックアウトの場合は git chekuout と、サブモジュールがある場合は git submodule update --init --recursive が次に呼びだされることを確認しています。
git submodule deinitと(A)の削除 または git submodule sync を適宜行うとうまく動作させられる可能性があります。
〇以下の投稿の場合(サブモジュール削除時)
サブモジュールの削除でサブモジュールのディレクトリと管理情報の一部が残る
サブモジュール削除時に以下のコマンドが呼び出されます
1. git submodule deinit -f
2. git rm --cached
3. git config -f .gitmodules --remove-section submodule.<submodule>
4. git add .gitmodules
こちらは 2 の --cached オプションは無くてもよいのではないかと思います。
また、別途(A)を削除する必要があります。
以上、よろしくお願いいたします。
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.