Gitサブモジュールを削除するにはどうすればよいですか?
ちなみに、単純にできない理由はあります
git submodule rm whatever
か?
Gitサブモジュールを削除するにはどうすればよいですか?
ちなみに、単純にできない理由はあります
git submodule rm whatever
か?
最新の git (私は 2022 年にこれを書いており、git
インストールを更新しています) では、これはかなり単純になりました。
git rm <path-to-submodule>
してコミットします。これにより、のファイル ツリーと、ファイル<path-to-submodule>
内のサブモジュールのエントリが削除され.gitmodules
ます。つまり、適切なリポジトリ内のサブモジュールのすべての痕跡が削除されます。
ただし、ドキュメントに記載されているよう.git
に、サブモジュールのmodules/
ディレクトリは(メインプロジェクトの.git
ディレクトリのディレクトリに)保持されており、「別のリポジトリからフェッチすることなく過去のコミットをチェックアウトできるようにするため」です。
それでもこの情報を削除したい場合は、 のサブモジュールのディレクトリを手動で削除.git/modules/
し、ファイルのサブモジュールのエントリを削除します.git/config
。これらの手順は、コマンドを使用して自動化できます
rm -rf .git/modules/<path-to-submodule>
、 とgit config --remove-section submodule.<path-to-submodule>
.古いコミュニティ wiki の手順:
Git Submodule Tutorialページ経由:
サブモジュールを削除するには、次のことが必要です。
.gitmodules
ファイルから削除します。.gitmodules
ます。git add .gitmodules
.git/config
。git rm --cached path_to_submodule
(末尾のスラッシュなし)。.git
ディレクトリを削除します。rm -rf .git/modules/path_to_submodule
git commit -m "Removed submodule <name>"
rm -rf path_to_submodule
以下も参照してください。
「 」でサブモジュールへの関心を表明すると、「このサブモジュールにはもう興味がありません」と言う磁器の方法はありませんでした
git submodule init
。
"git submodule deinit
" はそうする方法です。
削除プロセスでも使用されますgit rm
(2013 年 10 月の git1.8.5 以降)。
3 ステップの削除プロセスは次のようになります。
0. mv a/submodule a/submodule_tmp
1. git submodule deinit -f -- a/submodule
2. rm -rf .git/modules/a/submodule
3. git rm -f a/submodule
# Note: a/submodule (no trailing slash)
# or, if you want to leave it in your working tree and have done step 0
3. git rm --cached a/submodule
3bis mv a/submodule_tmp a/submodule
rm -rf
: これはDaniel Schroederの回答で言及されており、コメントでEonilによって要約されています。
これは
.git/modules/<path-to-submodule>/
変更されません。
したがって、この方法でサブモジュールを一度削除して再度追加すると、リポジトリが既に破損しているため、それは不可能です。
git rm
:コミット 95c16418を参照してください:
サブモジュールで現在 "
git rm
" を使用すると、スーパープロジェクトの作業ツリーからサブモジュールの作業ツリーが削除され、インデックスから gitlink が削除されます。
しかし、 のサブモジュールのセクション.gitmodules
はそのまま残されています。これは、削除されたサブモジュールの残り物であり、ユーザーを苛立たせる可能性があります ( の設定とは対照的に.git/config
、これは、ユーザーがこのサブモジュールに関心を示したことを思い出させるものとして残しておく必要があるため、後で再設定されます)古いコミットがチェックアウトされたとき)。
git rm
作業ツリーからサブモジュールを削除するだけでなく、ファイルとステージの両方submodule.<submodule name>
から " " セクションを削除することによって、ユーザーを" " 助けてください。.gitmodules
git submodule deinit
:このパッチに由来します:
"
git submodule init
" を使用すると、ユーザーは git に、1 つ以上のサブモジュールが必要であり、" " への次の呼び出しでそのサブモジュールを追加したいことを伝えることができますgit submodule update
。
しかし、現在、サブモジュールをもう気にせず、ローカルの作業ツリーを取り除きたいと git に伝える簡単な方法はありません (ユーザーがサブモジュールの内部についてよく知っていて、作業と一緒に"submodule.$name.url
" 設定を削除しない限り).git/config
木自身)。
deinit
' ' コマンドを提供して、これらのユーザーを支援します。
これは、指定されたサブモジュール (または ' ' が指定されている場合は初期化されているすべてのサブモジュール)からセクション全体を削除しsubmodule.<name>
.git/config
.
ます。
強制されない限り、現在の作業ツリーに変更が含まれている場合は失敗します。
コマンドラインで指定されたサブモジュールの URL 設定が で見つからない場合に文句を言いますが.git/config
、それでも失敗しません。
これにより、(非) 初期化手順 (.git/config
および.git/modules/xxx
)が処理されます。
git1.8.5 以降、git rm
は以下も処理します。
add
サブモジュールの URL をファイルに記録する' ' ステップ.gitmodules
: 削除する必要があります。git rm --cached path_to_submodule
(末尾のスラッシュはありません)最後の手順を忘れて、サブモジュールだったものを通常のディレクトリとして追加しようとすると、次のようなエラー メッセージが表示されます。
git add mysubmodule/file.txt
Path 'mysubmodule/file.txt' is in submodule 'mysubmodule'
注: Git 2.17 (2018 年第 2 四半期) 以降、git submodule deinit はシェル スクリプトではなくなりました。
C 関数の呼び出しです。
コミット 2e61273、コミット 1342476 (2018 年 1 月 14 日) によるPrathamesh Chavan ( pratham-pc
)を参照してください。
( 2018 年 2 月 13 日にcommit ead8dbeでJunio C Hamanoによってマージされました)gitster
git ${wt_prefix:+-C "$wt_prefix"} submodule--helper deinit \
${GIT_QUIET:+--quiet} \
${prefix:+--prefix "$prefix"} \
${force:+--force} \
${deinit_all:+--all} "$@"
ただのメモ。git 1.8.5.2 以降、次の 2 つのコマンドで実行できます。
git rm -r the_submodule
rm -rf .git/modules/the_submodule
@Mark Cheverton の回答が正しく指摘しているように、サブモジュールを今のところ削除したとしても、2 行目が使用されていない場合、残りの .git/modules/the_submodule フォルダーは、同じサブモジュールが将来追加または置換されるのを防ぎます。 . また、@VonCが述べたようgit rm
に、サブモジュールでほとんどの仕事をします。
-- 更新 (2017/07/05) --
明確にするためにthe_submodule
、プロジェクト内のサブモジュールの相対パスです。たとえばsubdir/my_submodule
、サブモジュールがサブディレクトリ内にある場合subdir
です。
コメントやその他の回答で正しく指摘されているように、2 つのコマンド (機能的にはサブモジュールを削除するのに十分ですが) は (2017 年 7 月現在) の[submodule "the_submodule"]
セクションに痕跡を残し.git/config
、3 番目のコマンドを使用して削除できます。
git config -f .git/config --remove-section submodule.the_submodule 2> /dev/null
簡単な手順
git config -f .git/config --remove-section submodule.$submodulename
git config -f .gitmodules --remove-section submodule.$submodulename
git rm --cached $submodulepath
rm -rf $submodulepath
rm -rf .git/modules/$submodulename
注意: $submodulepath
先頭または末尾のスラッシュは含まれません。
バックグラウンド
実行するgit submodule add
と に追加されるだけ.gitmodules
ですがgit submodule init
、実行すると に追加され.git/config
ます。
したがって、モジュールを削除したいが、すぐに復元できる場合は、次のようにします。
git rm --cached $submodulepath
git config -f .git/config --remove-section submodule.$submodulepath
これを
スクリプトに入れる場合は、git rebase HEAD
最初と最後に行うことをお勧めします。git commit
推奨事項に加えてrm -Rf .git/modules/path/to/submodule
、同じ名前の新しいサブモジュールを追加できるようにする必要もありました (私の場合、フォークを元のものに置き換えていました)。
.gitmodules
とのエントリを.git/config
削除し、履歴からモジュールのディレクトリを削除する必要があります。
git rm --cached path/to/submodule
あなたが git のメーリング リストに書き込めば、おそらく誰かがあなたのためにシェル スクリプトを作成してくれるでしょう。
エイリアスを使用して、他のユーザーが提供するソリューションを自動化できます。
[alias]
rms = "!f(){ git rm --cached \"$1\";rm -r \"$1\";git config -f .gitmodules --remove-section \"submodule.$1\";git config -f .git/config --remove-section \"submodule.$1\";git add .gitmodules; }; f"
それをgitconfigに入れると、次のことができます。git rms path/to/submodule
要約すると、これはあなたがすべきことです:
varを設定path_to_submodule
します (末尾のスラッシュなし):
path_to_submodule=path/to/submodule
関連する行を .gitmodules ファイルから削除します。
git config -f .gitmodules --remove-section submodule.$path_to_submodule
関連するセクションを .git/config から削除します
git config -f .git/config --remove-section submodule.$path_to_submodule
インデックスからのみ $path_to_submodule のステージングを解除して削除します (情報が失われないようにするため)
git rm --cached $path_to_submodule
.gitmodules に加えられた変更を追跡する
git add .gitmodules
スーパープロジェクトをコミットする
git commit -m "Remove submodule submodule_name"
現在追跡されていないサブモジュール ファイルを削除します。
rm -rf $path_to_submodule
rm -rf .git/modules/$path_to_submodule
私が現在2012年12月に行っていること(これらの回答のほとんどを組み合わせたもの):
oldPath="vendor/example"
git config -f .git/config --remove-section "submodule.${oldPath}"
git config -f .gitmodules --remove-section "submodule.${oldPath}"
git rm --cached "${oldPath}"
rm -rf "${oldPath}" ## remove src (optional)
rm -rf ".git/modules/${oldPath}" ## cleanup gitdir (optional housekeeping)
git add .gitmodules
git commit -m "Removed ${oldPath}"
最近、多くの便利な git 関連コマンドを含む git プロジェクトを見つけました: https://github.com/visionmedia/git-extras
インストールして次のように入力します。
git-delete-submodule submodule
その後、物事は行われます。サブモジュール ディレクトリはレポから削除されますが、ファイル システムにはまだ存在します。その後、次のように変更をコミットできますgit commit -am "Remove the submodule"
。
これが私がしたことです:
1.) .gitmodules ファイルから関連するセクションを削除します。以下のコマンドを使用できます。
git config -f .gitmodules --remove-section "submodule.submodule_name"
2.).gitmodules
変更をステージングする
git add .gitmodules
3.) から該当するセクションを削除します.git/config
。以下のコマンドを使用できます。
git submodule deinit -f "submodule_name"
4.) gitlink を削除します (末尾のスラッシュなし):
git rm --cached path_to_submodule
5.) 以下をクリーンアップし.git/modules
ます。
rm -rf .git/modules/path_to_submodule
6.) コミット:
git commit -m "Removed submodule <name>"
7.) 現在追跡されていないサブモジュール ファイルを削除します。
rm -rf path_to_submodule
John Douthat の手順をさらに一歩進めcd
てサブモジュールのディレクトリに移動し、Git リポジトリを削除する必要がありました。
cd submodule
rm -fr .git
次に、サブモジュールへの古い参照なしで、ファイルを親 Git リポジトリの一部としてコミットできます。
.submodule (正確な名前を忘れた) 隠しファイルを見つけました。リストがあります...その方法で個別に消去できます。1枚しか持ってなかったので削除しました。シンプルですが、サブモジュールに何かが接続されているかどうかわからないため、Git が台無しになる可能性があります。libetpan の通常のアップグレードの問題を除けば、これまでのところ問題ないように見えますが、それは (うまくいけば) 無関係です。
誰も手動消去を投稿していないことに気付いたので、追加しました
サブモジュールを追加したばかりで、たとえば、間違ったサブモジュールを追加したり、間違った場所に追加したりした場合はgit stash
、フォルダーを削除してください。これは、サブモジュールの追加が最近のリポジトリで行った唯一のことであると想定しています。
削除プロセスを容易にするために、bash スクリプトを作成しました。また、リポジトリに保存されていない変更があるかどうかを確認し、確認を求めます。os x
一般的な Linux ディストリビューションでも同様に動作するかどうかは、テスト済みです。
https://gist.github.com/fabifrank/cdc7e67fd194333760b060835ac0172f
最新の git では、git サブモジュールを削除するために必要な操作は 4 つだけです。
.gitmodules
git add .gitmodules
git rm --cached <path_to_submodule>
git commit -m "Removed submodule xxx"