web-dev-qa-db-ja.com

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

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

Git submodule addのpathオプションを使用して、フォルダーを指定しました。

git submodule add url_to_repo projectfolder

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

'projectfolder' already exists in the index"

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

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

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

187
Vanja

あなたは私のフォローアップの質問に答えていないので、何が起こっているのかを確実にするためにあなたの質問に十分な情報がないのではないかと思うが、これはどんな場合でも助けになるかもしれない。

このエラーは、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

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

ただし、(ファイルモード100644および100755で)多くのBLOBが表示されることもあります。これは、新しいリポジトリを所定の場所にコピーする前に、projectfolderのファイルを適切にステージ解除しなかったことを示唆します。その場合は、次の操作を実行してこれらのファイルをすべてステージ解除できます。

git rm -r --cached projectfolder

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

git submodule add url_to_repo projectfolder
300
Mark Longair

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

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

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

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

configのサブモジュールへの参照を削除します

vim .git/config

enter image description here

.gitmodulesを削除

rm -rf .gitmodules

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

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

サブモジュールの追加

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

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

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

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

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

上記の例の解決策:

  1. IS親リポジトリを既に複製しておいても大丈夫です。
  2. common_codeディレクトリにnotが存在することを確認してください。
  3. cd Repo
  4. git submodule add git://url_to_repo projectfolder/common_code/必要な末尾のスラッシュに注意してください。
  5. 正気が回復しました。

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

32
Shelton

最初にgitパスのサブモジュールgitリポジトリ(この場合はprojectfolder)を削除する必要があります。

rm -rf projectfolder

git rm -r projectfolder

そして、サブモジュールを追加します

git submodule add <git_submodule_repository> projectfolder
19
Neeraj Kumar

git制御下にxという名前のフォルダーが存在する場合、同じ名前のsubmoduleを追加する必要がありますフォルダーxを削除して最初にコミットする

@ ujjwal-singhにより更新:

コミットする必要はありません。ステージングで十分です。git add/git rm -r

14
justbilt

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

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

たとえば、専用のリポジトリである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 [email protected] sites/themes/AwesomeThemeを実行できます

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

2
Dylan Pierce

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

空のレポジトリタイプ:

git submodule add url_to_repo projectfolder/common_code

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

repo
|-- projectfolder
    |-- common_code

サブモジュールをさらに追加できるようになり、プロジェクトコードをprojectfolderに追加できるようになりました。

なぜこのように動作し、他の動作をしないのかはまだ言えません。

1
Vanja

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

0
Lawrence

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

0
Sam Biswas