一般的なコードをgitサブモジュールとして追加する際の問題:「インデックスにすでに存在しています」


225

私はgitを初めて使用するので、サブモジュールを追加する手助けをいただければ幸いです。いくつかの一般的なコードを共有する2つのプロジェクトを受け取りました。共有コードが2つのプロジェクトにコピーされました。共通コード用に別のgitリポジトリを作成し、それをgitサブモジュールとして追加する計画でプロジェクトから削除しました。

git submodule addのパスオプションを使用してフォルダーを指定しました。

git submodule add url_to_repo projectfolder

しかし、エラーが発生しました:

'projectfolder' already exists in the index"

これは私のリポジトリの望ましい構造です:

repo
|-- projectfolder
    |-- folder with common code

gitサブモジュールをリポジトリに直接追加するか、新しいフォルダに追加することは可能ですが、プロジェクトフォルダには追加できません。問題は、それが本当にプロジェクトフォルダーにある必要があるということです。これについて私は何ができますか、そしてgit submodule addのパスオプションについて何を誤解しましたか?


あなたがした場合、あなたは何を得るのgit ls-files --stage projectfolderですか?
Mark Longair

私は100644.で始まるすべてのコンテンツのリストを取得する
VANJA


8
私にとってgit rm既存のフォルダでの作業は役に立ちました:|
rogerdpack 2016

回答:


343

私のフォローアップの質問に返信していないため、何が起こっているのかを確認するのに十分な情報が質問に含まれていないと思いますが、これはいずれにせよ役立つかもしれません。

そのエラーは、それprojectfolderがすでにステージングされていることを意味します(「すでにインデックスに存在しています」)。ここで何が行われているのかを確認するには、そのフォルダーの下にあるインデックス内のすべてをリストしてみてください:

git ls-files --stage projectfolder

その出力の最初の列は、のインデックスにあるオブジェクトのタイプを示しますprojectfolder。(これらはUnixファイルモードに似ていますが、gitでは特別な意味があります。)

次のようなものが表示されると思います。

160000 d00cf29f23627fc54eb992dde6a79112677cd86c 0   projectfolder

(つまり、で始まる行160000)。この場合、リポジトリはprojectfolder「gitlink」としてすでに追加されています。の出力に表示されずgit submodule、サブモジュールとして再度追加したい場合は、次のようにします。

git rm --cached projectfolder

...ステージを解除し、次に:

git submodule add url_to_repo projectfolder

...リポジトリをサブモジュールとして追加します。

ただし、多くのblobが(ファイルモード100644とを使用して100755)リストされている可能性もあります。これはprojectfolder、新しいリポジトリを適切な場所にコピーする前にファイルを適切にアンステージしないことを示唆しています。その場合は、次のようにして、これらのファイルをすべてステージング解除できます。

git rm -r --cached projectfolder

...次にサブモジュールを追加します:

git submodule add url_to_repo projectfolder

13
詳細な回答をマークに感謝します。「git rm -r --cached projectfolder」を実行して、サブモジュールに再度接続しようとしました。しかし、今回は「rprojectfolderはすでに存在し、有効なgitリポジトリではありません」というエラーメッセージが表示されます。
Vanja 2012年

3
@Vanja:それはディレクトリprojectfolderが含まれていなかったことを示しています.gitprojectfolder他の場所用の新しいリポジトリを作成して所定の場所にコピーしたかのように質問から聞こえましたが、明らかにそうではありませんでした。既存projectfolderのものを邪魔にならない場所に移動してから.git、サブモジュールとして追加する前に、新しいリポジトリー(そのディレクトリーが完全なもの)を所定の場所にコピーする必要があります。または、で表されているリポジトリにすでにプッシュしているurl_to_repo場合projectfolderは、邪魔にならない場所に移動して、そのURLからサブモジュールを追加します。
Mark Longair 2012年

すばらしい回答+1のすべて
2013年

これは私にトンを助けました。ありがとうございました!
エヴァンモラン

1
これは私がやったことであり、3ステップのプロセスです。ステップ1:git rm -r --cached src / test / resources /、ステップ2:既存のリソースディレクトリを別の場所に削除します。ステップ3:git submodule add add url_to_repo src /テスト/リソース
vikramvi 2017年

52

サブモジュールを手動で削除するにはいくつかの手順が必要で、これは私にとってはうまくいきました。

あなたがプロジェクトのルートディレクトリにいて、サンプルのgitモジュール名が「c3-pro-ios-framework」であると仮定します

サブモジュールに関連付けられているファイルを削除します

rm -rf .git/modules/c3-pro-ios-framework/

構成内のサブモジュールへの参照をすべて削除します

vim .git/config

ここに画像の説明を入力してください

.gitmodulesを削除する

rm -rf .gitmodules

「git」なしでキャッシュから削除する

git rm --cached c3-pro-ios-framework

サブモジュールを追加

git submodule add https://github.com/chb/c3-pro-ios-framework.git

2
素晴らしい投稿、素晴らしい作品。共有してくださりありがとうございます。本当にすばらしい。
gabn88 2017

1
git submodule削除した後、追加する前にサブモジュールを一覧表示しようとしましたが、エラーが発生し、削除をコミットすると処理されました。
メフメット2017

1
できれば、この50倍に投票します。あなたは私の日を救った!
ジェームズ先生、

touch .gitmodules(作業ツリーにある必要があるため、削除すると役立ちます。ただし、再度追加する必要があります)。素晴らしい投稿です。ここで働いたものだけ。
トルク

それは.git私のためにまだ残っているディレクトリでした。これはうまくいきました。ありがとうございました。
ケビン・アンダーソン

44

まず、gitパスのサブモジュールgitリポジトリ(この場合はプロジェクトフォルダー)を削除する必要があります。

rm -rf projectfolder

git rm -r projectfolder

次にサブモジュールを追加します

git submodule add <git_submodule_repository> projectfolder

4
git submodule add --force <git_submodule_repository>同じサブモジュール名を維持するために私のために働いた
Tenfrow

1
ありがとう!! プロジェクトフォルダに追加する必要はありませんでした。サブディレクトリに移動し、そこからクローンを作成しました。
トニーフレイザー

32

私は同じ問題を抱えていて、何時間も探した後、答えを見つけました。

私が得ていたエラーは少し異なっていました: <path> already exists and is not a valid git repoそしてここにSEO値のために追加されました)

解決策は、サブモジュールを格納するディレクトリを作成しないことです。ディレクトリは、の一部として作成されますgit submodule addコマンドのます。

また、引数は作業ディレクトリではなく、親リポジトリのルートに相対的であることが期待されるため、注意してください。

上記の例の解決策:

  1. 親のレポがすでにクローンされていても問題ありません。
  2. common_codeディレクトリが存在しないことを確認してください。
  3. cd Repo
  4. git submodule add git://url_to_repo projectfolder/common_code/必要な末尾のスラッシュに注意してください。
  5. 健全性が回復しました。

これについて他の場所で見つけられる情報はほとんどないので、これが誰かの助けになることを願っています。


1
ステップ4が開始されgit submodule add、末尾のスラッシュは不要です。
nullability 2013年

タイプミスを修正しました。私はそれを再テストしました、そして最後のスラッシュは私のために違いを作りました。効果がある場合は、zshを使用しています。
未定義

これで問題が解決しました(サブモジュールの追加コマンドでディレクトリを作成する)。ありがとうございます。
jackJoe 2013年

18

xgitの制御下にある名前のフォルダーが存在する場合、同じ名前のサブモジュールを追加したい場合は、フォルダー削除して最初にコミットする必要がありますx。。

@ ujjwal-singhにより更新:

で十分ステージング、必要とされていないコミット.. git add/git rm -r


コミットは私が逃したものでした。短い答えですが、正解です!
Qqwy 2017

3
で十分ステージング、必要とされていないコミット... git add/gir rm -r
Ujjwal Singhの

3

エラーがあなたに伝えようとしていることを人間の言葉で明確にするためだけに:

メインリポジトリですでに追跡されているこのフォルダにリポジトリを作成することはできません。

例:AwesomeTheme専用リポジトリと呼ばれるテーマフォルダーがあり、メインリポジトリに直接ダンプしてみて、git submodule add sites/themesこれを取得し"AwesomeTheme" index already existsます。

sites/themes/AwesomeThemeサブモジュールをそこに作成できるように、メインリポジトリのバージョントラッキングにまだがないことを確認する必要があります。

修正するには、メインリポジトリで空のsites/theme/AwesomeThemeディレクトリがある場合は削除します。sites/theme/AwesomeThemeメインリポジトリのディレクトリですでにコミットを行っている場合は、次のようなコマンドを使用して、そのすべての履歴を消去する必要があります。

git filter-branch --index-filter \
              'git rm -r --cached --ignore-unmatch sites/theme/AwesomeTheme'     HEAD

これで実行できます git submodule add git@AwesomeTheme.repowhateverurlthing sites/themes/AwesomeTheme

メインリポジトリはこれまでに何も(インデックスとも呼ばれます)見たことがないため、sites/themes/AwesomeTheme作成できます。


1

私はそれを逆に行うことで機能させました。空のリポジトリから始めて、「projectfolder / common_code」という新しいフォルダにサブモジュールを追加します。その後、projectfolderにプロジェクトコードを追加することができました。詳細を以下に示します。

空のリポジトリのタイプ:

git submodule add url_to_repo projectfolder/common_code

これにより、目的のフォルダー構造が作成されます。

repo
|-- projectfolder
    |-- common_code

サブモジュールを追加することが可能になり、プロジェクトコードをプロジェクトフォルダに追加できるようになりました。

なぜそれがこのように機能し、他の方法では機能しなかったのかはまだ言えません。


0

これが便利かどうかはわかりませんが、IntelliJ 15内からファイルをコミットしようとしたときに同じ問題が発生しましたが、最後にSourceTreeを開いて、ファイルをコミットするだけで済みました。問題が解決しました。派手なgitコマンドを発行する必要はありません。誰かが同じ問題を抱えている場合に備えて、それについて言及するだけです。


0

リポジトリフォルダに移動します。.gitmodulesから関連するサブモジュールを削除します。隠しファイルを表示するを選択します。.gitフォルダーに移動し、モジュールフォルダーと構成からサブモジュールを削除します。


0

これは、ターゲットパスに.gitファイルがない場合に発生します。それは私が実行した後に私に起こりましたgit clean -f -d

メッセージに表示されているすべてのターゲットフォルダーを削除してから実行する必要がありました git submodule update --remote


-18

git dirで、すべての変更を同期するとします。

rm -rf .git 

rm -rf .gitmodules

次に行います:

git init
git submodule add url_to_repo projectfolder

2
これにより、プロジェクトの履歴全体が削除されます。
redbandit
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.