私は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オプションについて何を誤解しましたか?
あなたは私のフォローアップの質問に答えていないので、何が起こっているのかを確実にするためにあなたの質問に十分な情報がないのではないかと思うが、これはどんな場合でも助けになるかもしれない。
このエラーは、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
サブモジュールを手動で削除するには多くの手順が必要で、これは私にとってはうまくいきました。
プロジェクトのルートディレクトリにいて、サンプルgitモジュール名が「c3-pro-ios-framework」であると仮定します
サブモジュールに関連付けられているファイルを削除します
rm -rf .git/modules/c3-pro-ios-framework/
configのサブモジュールへの参照を削除します
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
私は同じ問題を抱えており、何時間も探して答えを見つけました。
私が得ていたエラーは少し異なっていました:<path> already exists and is not a valid git repo
(そしてSEO値のためにここに追加されました)
解決策は、サブモジュールを格納するディレクトリを作成しないことです。ディレクトリはgit submodule add
コマンドの一部として作成されます。
また、引数は、作業ディレクトリではなく、親リポジトリのルートに相対的であると予想されるため、注意してください。
上記の例の解決策:
common_code
ディレクトリにnotが存在することを確認してください。cd Repo
git submodule add git://url_to_repo projectfolder/common_code/
(必要な末尾のスラッシュに注意してください。)これについては他の場所ではほとんど情報が見つからないため、これが誰かの助けになることを願っています。
最初にgitパスのサブモジュールgitリポジトリ(この場合はprojectfolder)を削除する必要があります。
rm -rf projectfolder
git rm -r projectfolder
そして、サブモジュールを追加します
git submodule add <git_submodule_repository> projectfolder
git制御下にx
という名前のフォルダーが存在する場合、同じ名前のsubmoduleを追加する必要がありますフォルダーx
を削除して最初にコミットする。
@ ujjwal-singhにより更新:
コミットする必要はありません。ステージングで十分です。git add
/git rm -r
エラーがあなたに伝えようとしていることを人間の言語で明確にするためだけに:
メインリポジトリで既に追跡されているこのフォルダにリポジトリを作成することはできません。
たとえば、専用のリポジトリである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
で何も(インデックス化された)見たことがないため、今では作成できます。
私はそれを他の方法で行うことで機能しました。空のリポジトリから始めて、「projectfolder/common_code」という新しいフォルダーにサブモジュールを追加します。その後、projectfolderにプロジェクトコードを追加することができました。詳細を以下に示します。
空のレポジトリタイプ:
git submodule add url_to_repo projectfolder/common_code
これにより、目的のフォルダー構造が作成されます。
repo
|-- projectfolder
|-- common_code
サブモジュールをさらに追加できるようになり、プロジェクトコードをprojectfolderに追加できるようになりました。
なぜこのように動作し、他の動作をしないのかはまだ言えません。
IntelliJ 15内からファイルをコミットしようとしたときに同じ問題が発生しましたが、これが有用かどうかわかりません。最後に、SourceTreeを開いて、そこでファイルをコミットできました。問題が解決しました。派手なgitコマンドを発行する必要はありません。誰かが同じ問題を抱えている場合に言及してください。
リポジトリフォルダに移動します。関連するサブモジュールを.gitmodulesから削除します。 [隠しファイルを表示]を選択します。 .gitフォルダーに移動し、モジュールフォルダーと構成からサブモジュールを削除します。