web-dev-qa-db-ja.com

サブモジュールを削除する方法

Gitサブモジュールを削除する方法

ところで、単にgit submodule rm whateverができない理由はありますか?

3214

git1.8.3(2013年4月22日)

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 Schroederanswer で言及されており、 Eonil in the comments で要約されています:

これにより、.git/modules/<path-to-submodule>/は変更されません。
したがって、このメソッドでサブモジュールを一度削除してから再度追加すると、リポジトリがすでに破損しているため不可能です。


git rmcommit 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 rmalsoも処理します:

  • .gitmodulesファイルにサブモジュールのURLを記録する「add」ステップ:削除する必要があります。
  • サブモジュール特別なエントリこの質問 で示されているように):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サブモジュールdeinitはシェルスクリプトではなくなりました。
C関数の呼び出しです。

commit 2e6127commit 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} "$@"
2017
VonC

Git Submodule Tutorialを介して:

サブモジュールを削除するには、あなたがする必要があります:

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

下記のの代替ステップもご覧ください

3277
John Douthat

ちょっと注意してください。 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
401
tinlyx

この質問に対する回答の大多数は、時代遅れ、不完全、または不必要に複雑です。

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
357
fvgs

簡単な手順

  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を実行することをお勧めします。

への回答)Gitサブモジュールの実装を解除できますか? もご覧ください。

194
errordeveloper

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

81
Mark Cheverton

追加したサブモジュールを削除するには

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
52
Doug

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

git rm --cached path/to/submodule

もしあなたがgitのメーリングリストに書くなら、おそらく誰かがあなたのためにシェルスクリプトをするでしょう。

48
Carmine Paolino

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

[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

41
Charles

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

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

    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

39
luissquall

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

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

_ fwiw _ 、私は.gitをする前にgit addフォルダも削除しました。

38
Oli Studholme

私はdeinitが私のためにうまくいくことを見つけました:

git submodule deinit <submodule-name>    
git rm <submodule-name>

git docs :から

deinit

指定されたサブモジュールの登録を解除します。つまり、.git/configからsubmodule.$nameセクション全体をそれらの作業ツリーと一緒に削除します。

24
Damjan Pavlica

このサイトでさまざまな答えをすべて試した後、私はこの解決策に行き着きました。

#!/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)
21
udondan

私が現在行っていることは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}"
17
Lance Rushing

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

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
14
Ishan Liyanage

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

インストールして次のように入力してください。

git-delete-submodule submodule

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

13
Chien-Wei Huang

John Douthatのステップをさらに一歩進めてcdをサブモジュールのディレクトリに入れ、Gitリポジトリを削除しなければなりませんでした。

cd submodule
rm -fr .git

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

10
Kyle Clegg

これが私が必要であるか有用であると思う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 1git 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のどちらを実行するかには関係ありません。

8
laser
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
7
user257319

私はちょうど.submodule(正確な名前を忘れた)隠しファイルを見つけました、それはリストを持っています...あなたはそれらを個々にそのように消去することができます。持っていたので削除しました。単純ですが、サブモジュールに何が付いているのかわからないので、Gitがめちゃくちゃになる可能性があります。 libetpanの通常のアップグレードの問題は別として、これまでのところ大丈夫に思えますが、それは(うまくいけば)無関係です。

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

7
Stephen J

サブモジュールを追加したばかりの場合、たとえば間違ったサブモジュールを追加した場合や間違った場所に追加した場合は、単にgit stashを実行してからフォルダを削除します。これは、最近のリポジトリでサブモジュールを追加することだけが行ったことを前提としています。

4
botbot

削除処理を簡単にするためにbashスクリプトを作成しました。保存されていないレポに変更があるかどうかもチェックし、確認を求めます。 os xでテストされていますが、一般的なLinuxディストリビューションでも同様に動作するかどうかを知るのは興味深いでしょう。

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

1
Techradar

Git 2.17以降では、

git submodule deinit -f {module_name}
git add {module_name}
git commit
1
Albert Tobac

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

  • .gitmodules内の対応するエントリを削除します
  • ステージ変更git add .gitmodules
  • サブモジュールディレクトリgit rm --cached <path_to_submodule>を削除します。
  • コミットするgit commit -m "Removed submodule xxx"
0
rashok