web-dev-qa-db-ja.com

Gitサブモジュール内のファイルを追跡できません

問題:_./shells/smallApps/*_にあるファイルが_./.git/_にない場合、_./.git/info/exclude_にあるファイルをGitに追加しますまた、どの_.gitignore_ファイルでも使用できません。

この質問は this tread に基づいており、問題は完全には解決されていません。

走る

_$git status                                                                                                                                          ~/bin
# On branch master
nothing to commit (working directory clean)
$git ls-files                                                                                                                                        ~/bin
Screen/dev/vim-open.screen
--- cut ---
_

私のGitには「shells/smallApps/*」というファイルがないことに注意します

_$ls shells/smallApps/                                                                                                                                ~/bin
devTodo     extract     
                                                                                                                                             ~/bin
_

実行してそれらをGitに追加したい

_$git add shells/smallApps/devTodo shells/smallApps/extract
fatal: Path 'shells/smallApps/devTodo' is in submodule 'shells/smallApps'
$git add .         
_

ファイルが何らかの理由で私のGitに追加されないことに注意してください。

_$git status                                                                                                                                          ~/bin 
# On branch master
nothing to commit (working directory clean)
_

.git/info/excludeにも.gitignore -filesにもファイルがありません。

最後の警告はどういう意味ですか?

[〜#〜]更新[〜#〜]

Gitがファイルを無視する一般的な理由は2つあります gitignore および submodules

具体的には、次の条件により、 'git add'が呼び出されたときにGitがファイルを無視します。

  1. ファイルはパターン$GIT_DIR/excludeに一致します。
  2. ファイルは、リポジトリ内の.gitignoreファイルのパターンと一致します。
  3. ファイルは、ユーザー固有の.gitignoreファイル( 'git config --global core.excludesfile'で指定)のパターンと一致します。
  4. ファイルはサブモジュールの一部です。

無視されたファイルに「git add」を強制する:

'git add full/path/to/file'を呼び出すことにより、特定のファイルが無視されているかどうかを確認できます。

「無視されたファイルがコマンドラインで明示的に指定されている場合、コマンドは無視されたファイルのリストで失敗します。」

ファイルが無視される場合は、「git add --force full/path/to/file」を使用して強制的に追加できます。

サブモジュール参照を削除する手順:

以前の回答で述べたように、shells/smallAppsはリポジトリ内の サブモジュール です。

ファイルがサブモジュールの一部である場合、状況はより複雑になります。メインプロジェクト内からサブモジュールの内容を変更することはできません。

サブモジュール参照を削除し、メインリポジトリのファイルを直接追跡する場合は、いくつかの手順を実行する必要があります。 「.git」ディレクトリをサブモジュールから単に削除することはできません。メインリポジトリとサブモジュールの間には3つのリンクがあります。

  1. メインリポジトリの.gitmodulesファイル。
  2. メインリポジトリの.git/configのエントリ。
  3. メインのリポジトリ履歴のサブモジュールに関連するコミット。

この 関連するSO質問 に従って、サブモジュールを完全に削除するには、次の手順を実行する必要があります。

注:別のブランチがこのサブモジュールに依存している場合、それを削除するとリポジトリが破損する可能性があります!これは危険な操作です...注意して使用してください。

  1. .gitmodulesファイルから関連する行を削除します。
  2. .git/configから関連セクションを削除します。
  3. git rm --cached path_to_submodule(末尾のスラッシュなし)を実行します。
  4. コミット

サブモジュールの一部であったファイルは追跡されなくなり、必要に応じてそれらを保持するか削除するかを決定できます(下記の1つの注意事項を参照)。

これらのファイルが不要な場合は、単に削除してください。

警告:これらのファイル(保持しているように見える)を保持する場合は、サブモジュールフォルダーから.gitディレクトリを手動で削除する必要があります:

  1. cd path_to_submodule
  2. rm .git
  3. cd ..
  4. git add path_to_submodule
  5. git status
  6. git commit

UPDATE:

詳細情報のリクエスト:

この問題のデバッグを支援するには、次の完全なコマンドセッションの出力を投稿してください。

cd to the top-level directory in your repo
ls -al
cat .git/config
find . -name ".git*"
git status
git add editors
git add shells
git status

これまでに行ったことの説明に基づいて、私は次のことを期待しています。

  • .gitmodulesファイルはどこにもありません
  • .gitディレクトリは1つのみ(リポジトリのルートにあります)
  • .giteditors/vim/vimdocletディレクトリがありません
  • .gitshells/smallAppsディレクトリがありません
99
Tim Henigan

git addサブモジュールについて何か言っています。ネストされたGitリポジトリがありますか?これを行う:

$ find . -name .git

幾つ .gitディレクトリがリストされていますか?複数ある場合は、ネストされたリポジトリが複数あり、それがこの混乱の原因となっている可能性があります。

2
Greg Hewgill

この質問をGitメーリングリスト([email protected])。より迅速で完全な応答が得られる可能性があります。

あなたがそこに投稿することにした場合は、必ず含めるようにしてください:

  • 達成しようとしていることの説明。
  • 発生した問題の説明。
  • 以下を示す完全なセッションログ:
    • リポジトリの最上位ディレクトリに移動します
    • ls -al
    • cat .git/config
    • find . -name ".git*"
    • git status
    • git add editors
    • git add shells
    • git status
2
Tim Henigan