Gitサブモジュールを削除する方法
ところで、単にgit submodule rm whatever
ができない理由はありますか?
「
submodule init
」を使用してサブモジュールに関心を表明すると、「このサブモジュールに興味がなくなった」と言う磁器の方法はありませんでした。
"submodule deinit
"はそうする方法です。
削除プロセスもgit rm
を使用します(git1.8.5 2013年10月以降)。
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 の answer で言及されており、 Eonil in the comments で要約されています:
これにより、
.git/modules/<path-to-submodule>/
は変更されません。
したがって、このメソッドでサブモジュールを一度削除してから再度追加すると、リポジトリがすでに破損しているため不可能です。
git rm
: commit 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
はalsoも処理します:
.gitmodules
ファイルにサブモジュールのURLを記録する「add
」ステップ:削除する必要があります。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サブモジュールdeinitはシェルスクリプトではなくなりました。
C関数の呼び出しです。
commit 2e6127 、 commit 1342476 (2018年1月14日)by Prathamesh Chavan(pratham-pc
) を参照してください。
( C浜野潤夫-gitster
- in commit ead8dbe 、2018年2月13日)
git ${wt_prefix:+-C "$wt_prefix"} submodule--helper deinit \
${GIT_QUIET:+--quiet} \
${prefix:+--prefix "$prefix"} \
${force:+--force} \
${deinit_all:+--all} "$@"
サブモジュールを削除するには、あなたがする必要があります:
.gitmodules
ファイルから関連セクションを削除します。.gitmodules
の変更をステージングするgit add .gitmodules
.git/config
から関連セクションを削除します。git rm --cached path_to_submodule
を実行します(末尾のスラッシュなし)。rm -rf .git/modules/path_to_submodule
を実行するgit commit -m "Removed submodule <name>"
をコミットするrm -rf path_to_submodule
下記の: の代替ステップもご覧ください 。
ちょっと注意してください。 git 1.8.5.2以降、2つのコマンドが実行されます。
git rm the_submodule
rm -rf .git/modules/the_submodule
@ Mark Chevertonの答えが正しく指摘しているように、2行目が使われていなければ、今のところサブモジュールを削除しても、残りの.git/modules/the_submoduleフォルダは将来同じサブモジュールの追加や置き換えを防ぎます。また@VonCが述べたように、git rm
はサブモジュールでほとんどの仕事をします。
- アップデート(2017/05/07) -
明確にするために、the_submodule
はプロジェクト内のサブモジュールの相対パスです。たとえば、サブモジュールがサブディレクトリsubdir
の中にある場合はsubdir/my_submodule
です。
コメントと 他の答え で正しく指摘されているように、2つのコマンド(サブモジュールを削除するのに機能的には十分ですが)は、[submodule "the_submodule"]
の.git/config
セクションにトレースを残します。 3番目のコマンドを使用して削除します。
git config -f .git/config --remove-section submodule.the_submodule 2> /dev/null
この質問に対する回答の大多数は、時代遅れ、不完全、または不必要に複雑です。
Git 1.7.8以降を使用してクローンを作成したサブモジュールは、ローカルリポジトリに最大4つのトレースを残します。これら4つのトレースを削除するプロセスは、以下の3つのコマンドによって与えられます。
# Remove the submodule entry from .git/config
git submodule deinit -f path/to/submodule
# Remove the submodule directory from the superproject's .git/modules directory
rm -rf .git/modules/path/to/submodule
# Remove the entry in .gitmodules and remove the submodule directory located at path/to/submodule
git rm -f path/to/submodule
簡単な手順
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
を実行することをお勧めします。
への回答)Gitサブモジュールの実装を解除できますか? もご覧ください。
推奨事項に加えて、同じ名前の新しいサブモジュールを追加できるようにするためにもrm -Rf .git/modules/path/to/submodule
を使わなければなりませんでした(私の場合はフォークを元のものに置き換えていました)。
追加したサブモジュールを削除するには
git submodule add [email protected]:repos/blah.git lib/blah
実行します。
git rm lib/blah
それでおしまい。
Gitの古いバージョン(約1.8.5前後)では
git submodule deinit lib/blah
git rm lib/blah
git config -f .gitmodules --remove-section submodule.lib/blah
.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"
それをあなたのgitの設定に入れてください、そうすればあなたはできるようになります:git rms path/to/submodule
要約すると、これはあなたがすべきことです:
path_to_submodule
varを設定します(末尾のスラッシュなし)。
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
既にGitリポジトリ(.git
を含む)であるフォルダーを追加、コミット、プッシュしたためにサブモジュールが 誤って に追加された場合、編集する.gitmodules
ファイル、または.git/config
内のものはありません。 この場合、必要なのは だけです。
git rm --cached subfolder
git add subfolder
git commit -m "Enter message here"
git Push
_ fwiw _ 、私は.git
をする前にgit add
フォルダも削除しました。
私はdeinit
が私のためにうまくいくことを見つけました:
git submodule deinit <submodule-name>
git rm <submodule-name>
git docs :から
deinit
指定されたサブモジュールの登録を解除します。つまり、.git/configから
submodule.$name
セクション全体をそれらの作業ツリーと一緒に削除します。
このサイトでさまざまな答えをすべて試した後、私はこの解決策に行き着きました。
#!/bin/sh
path="$1"
if [ ! -f "$path/.git" ]; then
echo "$path is no valid git submodule"
exit 1
fi
git submodule deinit -f $path &&
git rm --cached $path &&
rm -rf .git/modules/$path &&
rm -rf $path &&
git reset HEAD .gitmodules &&
git config -f .gitmodules --remove-section submodule.$path
これにより、サブモジュールを追加した前とまったく同じ状態に戻ります。サブモジュールをすぐに追加し直すことができますが、これはほとんどの答えでは不可能でした。
git submodule add $giturl test
aboveScript test
これにより、コミットを変更することなく、清潔なチェックアウトが可能になります。
これは以下でテストされました。
$ git --version
git version 1.9.3 (Apple Git-50)
私が現在行っていることは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}"
これが私がしたことです:
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
私は最近、多くの便利なgit関連コマンドを含むgitプロジェクトを見つけました: https://github.com/visionmedia/git-extras
インストールして次のように入力してください。
git-delete-submodule submodule
それから物事が行われます。サブモジュールディレクトリはリポジトリから削除され、ファイルシステムに残っています。その後、git commit -am "Remove the submodule"
のように変更をコミットできます。
John Douthatのステップをさらに一歩進めてcd
をサブモジュールのディレクトリに入れ、Gitリポジトリを削除しなければなりませんでした。
cd submodule
rm -fr .git
そうすれば、古いサブモジュールを参照せずに、親のGitリポジトリの一部としてファイルをコミットできます。
これが私が必要であるか有用であると思う4つのステップです(最初に重要なもの):
git rm -f the_submodule
rm -rf .git/modules/the_submodule
git config -f .git/config --remove-section submodule.the_submodule
git commit -m "..."
理論では、step 1のgit rm
がそれを処理します。うまくいけば、OP質問の2番目の部分は1日肯定的に答えることができます(これは1つのコマンドで行うことができるということです)。
しかし、2017年7月現在、.git/modules/
のデータを削除するにはstep 2が必要です。将来サブモジュールを追加してください。
すべてのgit submodule
コマンドがうまくいくように見えるので、 tinlyxの答え として、git 1.8.5以降の場合の上記2つのステップを多分避けることができます。
手順3では、ファイルthe_submodule
から.git/config
のセクションを削除します。これは完全を期すために行われるべきです。 (このエントリーは古いgitバージョンでは問題を起こすかもしれませんが、テストするものはありません)。
このため、ほとんどの回答はgit submodule deinit
を使用することを提案しています。私はgit config -f .git/config --remove-section
を使うことがより明確で混乱しにくいと思います。 git-submoduleのドキュメント 、git deinit
によれば、
与えられたサブモジュールの登録を解除します...本当にサブモジュールをリポジトリから削除してコミットする場合は、代わりにgit-rm [1] を使用してください。
最後に重要なことを言い忘れましたが、あなたがgit commit
をしていない場合、git submodule summary
を実行するときにエラーが発生するでしょう。
fatal: Not a git repository: 'the_submodule/.git'
* the_submodule 73f0d1d...0000000:
これは、ステップ2と3のどちらを実行するかには関係ありません。
project dir: ~/foo_project/
submodule: ~/foo_project/lib/asubmodule
- - - - - - - - - - - - - - - - - - - - - - - - -
run:
1. cd ~/foo_project
2. git rm lib/asubmodule &&
rm .git/modules/lib/asubmodule &&
git submodule lib/asubmodule deinit --recursive --force
私はちょうど.submodule(正確な名前を忘れた)隠しファイルを見つけました、それはリストを持っています...あなたはそれらを個々にそのように消去することができます。持っていたので削除しました。単純ですが、サブモジュールに何が付いているのかわからないので、Gitがめちゃくちゃになる可能性があります。 libetpanの通常のアップグレードの問題は別として、これまでのところ大丈夫に思えますが、それは(うまくいけば)無関係です。
誰も手動消去を投稿していないので、追加しました
サブモジュールを追加したばかりの場合、たとえば間違ったサブモジュールを追加した場合や間違った場所に追加した場合は、単にgit stash
を実行してからフォルダを削除します。これは、最近のリポジトリでサブモジュールを追加することだけが行ったことを前提としています。
削除処理を簡単にするためにbashスクリプトを作成しました。保存されていないレポに変更があるかどうかもチェックし、確認を求めます。 os x
でテストされていますが、一般的なLinuxディストリビューションでも同様に動作するかどうかを知るのは興味深いでしょう。
https://Gist.github.com/fabifrank/cdc7e67fd194333760b060835ac0172f
Git 2.17以降では、
git submodule deinit -f {module_name}
git add {module_name}
git commit
最新のgitでは、gitサブモジュールを削除するのに4回の操作だけが必要です。
.gitmodules
内の対応するエントリを削除しますgit add .gitmodules
git rm --cached <path_to_submodule>
を削除します。git commit -m "Removed submodule xxx"