4015

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

ちなみに、単純にできない理由はあります git submodule rm whateverか?

4

36 に答える 36

3805

最新の 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ページ経由:

サブモジュールを削除するには、次のことが必要です。

  1. 関連するセクションを.gitmodulesファイルから削除します。
  2. 変更をステージングし.gitmodulesます。
    git add .gitmodules
  3. から該当するセクションを削除します.git/config
  4. 作業ツリーとインデックスからサブモジュール ファイルを削除します:
    git rm --cached path_to_submodule(末尾のスラッシュなし)。
  5. サブモジュールの.gitディレクトリを削除します。
    rm -rf .git/modules/path_to_submodule
  6. 変更をコミットします。
    git commit -m "Removed submodule <name>"
  7. 現在追跡されていないサブモジュール ファイルを削除します。
    rm -rf path_to_submodule

以下も参照してください。

于 2009-08-11T15:09:16.540 に答える
2563

git1.8.3 (2013 年 4 月 22 日)以降:

「 」でサブモジュールへの関心を表明すると、「このサブモジュールにはもう興味がありません」と言う磁器の方法はありませんでした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 はそれをインデックスから削除します:
    git rm --cached path_to_submodule(末尾のスラッシュはありません)
    これにより、特別なモード「160000」でインデックスに保存されているディレクトリが削除され、サブモジュールのルート ディレクトリとしてマークされます。 .

最後の手順を忘れて、サブモジュールだったものを通常のディレクトリとして追加しようとすると、次のようなエラー メッセージが表示されます。

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 ead8dbeJunio C Hamanoによってマージされました)gitster

git ${wt_prefix:+-C "$wt_prefix"} submodule--helper deinit \
  ${GIT_QUIET:+--quiet} \
  ${prefix:+--prefix "$prefix"} \
  ${force:+--force} \
  ${deinit_all:+--all} "$@"
于 2013-04-23T05:57:49.983 に答える
611

ただのメモ。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
于 2014-01-18T23:30:05.033 に答える
228

簡単な手順

  1. 構成エントリを削除します。
    git config -f .git/config --remove-section submodule.$submodulename
    git config -f .gitmodules --remove-section submodule.$submodulename
  2. インデックスからディレクトリを削除:
    git rm --cached $submodulepath
  3. 専念
  4. 未使用のファイルを削除します。
    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

Can I unpopulate a Git submodule?への回答もご覧ください。.

于 2011-10-04T11:06:30.773 に答える
84

推奨事項に加えてrm -Rf .git/modules/path/to/submodule、同じ名前の新しいサブモジュールを追加できるようにする必要もありました (私の場合、フォークを元のものに置き換えていました)。

于 2012-03-02T16:07:44.740 に答える
59

.gitmodulesとのエントリを.git/config削除し、履歴からモジュールのディレクトリを削除する必要があります。

git rm --cached path/to/submodule

あなたが git のメーリング リストに書き込めば、おそらく誰かがあなたのためにシェル スクリプトを作成してくれるでしょう。

于 2009-08-11T14:43:38.953 に答える
43

エイリアスを使用して、他のユーザーが提供するソリューションを自動化できます。

[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

于 2012-11-01T21:43:37.407 に答える
43

要約すると、これはあなたがすべきことです:

  1. varを設定path_to_submoduleします (末尾のスラッシュなし):

    path_to_submodule=path/to/submodule

  2. 関連する行を .gitmodules ファイルから削除します。

    git config -f .gitmodules --remove-section submodule.$path_to_submodule

  3. 関連するセクションを .git/config から削除します

    git config -f .git/config --remove-section submodule.$path_to_submodule

  4. インデックスからのみ $path_to_submodule のステージングを解除して削除します (情報が失われないようにするため)

    git rm --cached $path_to_submodule

  5. .gitmodules に加えられた変更を追跡する

    git add .gitmodules

  6. スーパープロジェクトをコミットする

    git commit -m "Remove submodule submodule_name"

  7. 現在追跡されていないサブモジュール ファイルを削除します。

    rm -rf $path_to_submodule

    rm -rf .git/modules/$path_to_submodule

于 2012-07-09T17:55:21.347 に答える
42

既に Git リポジトリ (含まれている) であるフォルダーを追加、コミット、およびプッシュしたためにサブモジュールが誤って追加された場合、編集するファイルや. この場合、必要なのは次のとおりです。.git.gitmodules.git/config

git rm --cached subfolder
git add subfolder
git commit -m "Enter message here"
git push

FWIW.git 、実行する前にフォルダーも削除しましたgit add

于 2012-05-16T09:27:18.870 に答える
18

私が現在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}"
于 2012-12-18T22:50:23.200 に答える
15

最近、多くの便利な git 関連コマンドを含む git プロジェクトを見つけました: https://github.com/visionmedia/git-extras

インストールして次のように入力します。

git-delete-submodule submodule

その後、物事は行われます。サブモジュール ディレクトリはレポから削除されますが、ファイル システムにはまだ存在します。その後、次のように変更をコミットできますgit commit -am "Remove the submodule"

于 2013-10-08T18:39:28.447 に答える
15

これが私がしたことです:

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
于 2016-03-02T09:26:29.170 に答える
11

John Douthat の手順をさらに一歩進めcdてサブモジュールのディレクトリに移動し、Git リポジトリを削除する必要がありました。

cd submodule
rm -fr .git

次に、サブモジュールへの古い参照なしで、ファイルを親 Git リポジトリの一部としてコミットできます。

于 2012-11-23T10:34:04.487 に答える
8

.submodule (正確な名前を忘れた) 隠しファイルを見つけました。リストがあります...その方法で個別に消去できます。1枚しか持ってなかったので削除しました。シンプルですが、サブモジュールに何かが接続されているかどうかわからないため、Git が台無しになる可能性があります。libetpan の通常のアップグレードの問題を除けば、これまでのところ問題ないように見えますが、それは (うまくいけば) 無関係です。

誰も手動消去を投稿していないことに気付いたので、追加しました

于 2014-06-16T08:05:55.470 に答える
4

サブモジュールを追加したばかりで、たとえば、間違ったサブモジュールを追加したり、間違った場所に追加したりした場合はgit stash、フォルダーを削除してください。これは、サブモジュールの追加が最近のリポジトリで行った唯一のことであると想定しています。

于 2016-06-01T08:35:20.213 に答える
1

削除プロセスを容易にするために、bash スクリプトを作成しました。また、リポジトリに保存されていない変更があるかどうかを確認し、確認を求めます。os x一般的な Linux ディストリビューションでも同様に動作するかどうかは、テスト済みです。

https://gist.github.com/fabifrank/cdc7e67fd194333760b060835ac0172f

于 2019-05-22T15:53:38.823 に答える
0

最新の git では、git サブモジュールを削除するために必要な操作は 4 つだけです。

  • の対応するエントリを削除します .gitmodules
  • ステージチェンジgit add .gitmodules
  • サブモジュール ディレクトリを削除しますgit rm --cached <path_to_submodule>
  • コミットするgit commit -m "Removed submodule xxx"
于 2019-03-01T14:48:24.813 に答える