Git サブモジュールをサブモジュール解除するにはどうすればいいですか? 質問する

Git サブモジュールをサブモジュール解除するにはどうすればいいですか? 質問する

Git サブモジュールのサブモジュールを解除し、すべてのコードをコアリポジトリに戻すためのベストプラクティスは何ですか?

ベストアンサー1

サブモジュール コードをメイン リポジトリに配置するだけの場合は、サブモジュールを削除して、ファイルをメイン リポジトリに再度追加するだけです。

git rm --cached submodule_path  # delete reference to submodule HEAD (no trailing slash)
git rm .gitmodules              # if you have more than one submodules,
                                # you need to edit this file instead of deleting!
rm -rf submodule_path/.git      # make sure you have backup!!
git add --force submodule_path  # will add files instead of commit reference
                                # --force adds files ignored by .gitignore
git commit -m "remove submodule"

サブモジュールの履歴も保存したい場合は、サブモジュールをメイン リポジトリに「マージ」するという小さなトリックを実行できます。これにより、サブモジュール ファイルがメイン リポジトリにあることを除いて、結果は以前と同じになります。

メイン モジュールでは、次の操作を行う必要があります。

# Create a 'marker' at the submodule commit being used
cd submodule_path
git switch --create "submodule_merge_marker"
git push --set-upstream origin submodule_merge_marker

# Fetch the submodule commits into the main repository
git remote add submodule_origin git://url/to/submodule/origin
git fetch submodule_origin

# Start a fake merge (won't change any files, won't commit anything)
git merge -s ours --no-commit submodule_origin/submodule_merge_marker

# Do the same as in the first solution
git rm --cached submodule_path  # delete reference to submodule HEAD
git rm .gitmodules              # if you have more than one submodules,
                                # you need to edit this file instead of deleting!
rm -rf submodule_path/.git      # make sure you have backup!!
git add --force submodule_path  # will add files instead of commit reference
                                # --force adds files ignored by .gitignore

# Commit and cleanup
git commit -m "remove submodule"
git remote rm submodule_origin

結果のリポジトリは少し奇妙に見えます。最初のコミットが複数あるからです。ただし、Git に問題は発生しません。

この 2 番目のソリューションの大きな利点は、サブモジュールに元々あったファイルに対してもgit blameまたは を実行できることです。実際、ここで行われているのは 1 つのリポジトリ内の多数のファイルの名前変更だけであり、Git はこれを自動的に検出するはずです。 でまだ問題が発生する場合は、名前変更とコピーの検出をより適切に行うオプション ( 、、など) を試してください。git loggit log--follow-M-C

おすすめ記事