Подтвердить что ты не робот

Невозможно отслеживать файлы в подмодулях Git

Проблема: добавить файлы с ./shells/smallApps/* до Git в ./.git/, когда у меня нет файлов в ./.git/info/exclude или ни в одном .gitignore -files.

Этот вопрос основан на этом проходе, где проблема не решена полностью.

Я запустил

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

Я отмечаю, что у меня нет файлов "shells/smallApps/*" на моем Git

$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.

Что означает последнее предупреждение?

4b9b3361

Ответ 1

UPDATE

Есть две общие причины, по которым Git игнорирует файл: gitignore и submodules.

Чтобы быть более конкретным, следующие условия вызовут Git игнорировать файл, когда вызывается "git add":

  • Файл соответствует шаблону $GIT_DIR/exclude.
  • Файл соответствует шаблону в файле .gitignore внутри репо.
  • Файл соответствует шаблону в пользовательском файле .gitignore (указанном 'git config --global core.excludesfile').
  • Файл является частью подмодуля.

Принуждение 'git add' к игнорируемому файлу:

Вы можете проверить, игнорируется ли какой-либо конкретный файл, вызывая 'git add full/path/to/file'.

На странице руководства указано, что "Если в командной строке явно указано проигнорированный файл, команда завершится неудачно со списком игнорируемых файлов".

Если файл игнорируется, вы можете заставить его добавить "git add --force full/path/to/file".

Инструкции по устранению ссылки на подмодуль:

Как отмечено в предыдущем ответе, shells/smallApps является submodule в вашем репозитории.

Если файл является частью подмодуля, ситуация более сложная. Вы не можете изменять содержимое субмодуля из основного проекта.

Если вы хотите исключить ссылку на субмодуль и напрямую отслеживать файлы в своем основном репо, необходимо выполнить несколько шагов. Вы не можете просто удалить каталог ".git" из подмодуля. Между вашим основным хранилищем и подмодулем существует три связи:

  • Файл .gitmodules в вашем основном репо.
  • Запись в .git/config вашего основного репо.
  • Любые коммиты, связанные с подмодулем в вашей основной истории репо.

В этом связанном вопросе SO вам необходимо выполнить следующие шаги, чтобы полностью удалить подмодуль:

ПРИМЕЧАНИЕ. Если для этого субмодуля зависит другое ветвление, то удаление его может повредить ваш репозиторий! Это опасная операция... используйте с осторожностью.

  • Удалите соответствующую строку из файла .gitmodules.
  • Удалить соответствующий раздел из .git/config.
  • Запустите git rm --cached path_to_submodule (нет косой черты).
  • Фиксировать

Файлы, которые были частью субмодуля, теперь не отслеживаются, и вы можете решить сохранить или удалить их по своему желанию (с одним из указанных ниже предостережений).

Если вам не нужны эти файлы, вы можете просто удалить их.

Предостережение. Если вы хотите сохранить эти файлы (что вам кажется нужным), вы должны вручную удалить каталог .git из папки подмодуля:

  • cd path_to_submodule
  • rm .git
  • cd ..
  • git add path_to_submodule
  • git status
  • 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 (найденный в корне вашего репо)
  • Нет .git в каталоге editors/vim/vimdoclet
  • Нет .git в каталоге shells/smallApps

Ответ 2

Я вижу, что у вас есть git add, говорящий о субмодулях. У вас есть вложенные репозитории Git? Сделайте это:

$ find . -name .git

Сколько каталогов .git указано? Если их несколько, то у вас есть несколько вложенных репозиториев, и это может быть причиной некоторой путаницы.

Ответ 3

Вам следует рассмотреть вопрос о отправке этого вопроса в список почты Git ([email protected]). Вероятно, вы получите более быстрый и полный ответ.

Если вы решили разместить там сообщение, обязательно укажите:

  • Описание того, что вы пытаетесь достичь.
  • Описание проблемы, с которой вы столкнулись.
  • Полный журнал сеансов:
    • cd в каталог верхнего уровня в вашем репо
    • ls -al
    • cat .git/config
    • find . -name ".git*"
    • git status
    • git add editors
    • git add shells
    • git status