Как избавиться от подмодулей Git в статусе unracked?

149

Кажется, я не могу избавиться от неотслеживаемого контента в подмодулях Git. Беговые git statusурожаи:

# На ветке мастер
# Изменения не подготовлены для коммита:
# (используйте «git add ...» для обновления того, что будет зафиксировано)
# (используйте "git checkout - ...", чтобы отменить изменения в рабочем каталоге)
# (зафиксировать или удалить неотслеживаемый или измененный контент в подмодулях)
#
# изменено: связка / фрагмент (неотслеживаемый контент)
# изменено: связка / объемное звучание (неотслеживаемый контент)
# изменено: пакет / конечный пробел (неотслеживаемый контент)
# изменено: пакет / zencoding (неотслеживаемый контент)
#
изменения не добавлены в коммит (используйте «git add» и / или «git commit -a»)

Добавление --ignore-submodulesпараметра скрывает эти сообщения; но мне интересно, есть ли способ избавиться от этой грязи более подходящим способом.

Томер Лихташ
источник
3
Этот ответ: stackoverflow.com/a/5127213/199649 вызывает больше вариантов.
Чарлакс

Ответы:

95

Поскольку состояние git сообщает о неотслеживаемом контенте, фактический способ получить чистый статус состоял бы в том, чтобы войти в каждый из этих подмодулей и:

  • добавить и зафиксировать неотслеживаемое содержимое,
  • или ссылаться на неотслеживаемое содержимое в .gitignoreконкретном для каждого модуля.
  • или вы можете добавить то же игнорировал содержимое в подмодуле - х .git/info/exclude, как и peci1 отчеты в комментариях .
  • или добавить грязные спецификации подмодуля, как указано в ezraspectre «s ответа (upvoted).

    git config -f .gitmodules submodule.<path>.ignore untracked
    
  • или добавить глобальный .gitignore файл (часто ~/.gitignore-global). Как, например, .DS_Storeили в моем случае, Carthage/Buildкак сообщил Мариан Черны в комментариях . Смотрите .gitginoreсправочную страницу :

Шаблоны, которые пользователь хочет игнорировать Git во всех ситуациях (например, резервные копии или временные файлы, сгенерированные выбранным редактором пользователя), обычно попадают в файл, указанный core.excludesFileпользователем ~/.gitconfig. Его значение по умолчанию $XDG_CONFIG_HOME/git/ignore. Если $XDG_CONFIG_HOMEлибо не установлено, либо пусто, $HOME/.config/git/ignoreиспользуется вместо этого.

VonC
источник
5
+1, я был почти готов кричать, пока не нашел это ... затем понял, что .DS_Storeфайл был автоматически создан (OS X) в одном из моих подмодулей, не давая мне зафиксировать основной проект. Arg! Время обновлять .gitignore...
Кортни Кристенсен
Используя XCode, я также нашел полезным добавить * .xcuserdatad в файл .gitignore-global. Это предотвращает попытки git отследить локальные настройки Xcode.
Рой Шарон
Если у вас нет прав на продвижение субмодуля, вы не сможете поделиться своими изменениями с субмодулем с другими пользователями родительского репо. Решение @ quincyglenn, кажется, работает в таком случае.
Дрю Ноакс
1
@VonC, любой ответ имеет смысл в зависимости от ситуации и предпочтений. Я хотел подчеркнуть это различие как ссылку на других. Кстати, спасибо за ваши многочисленные ответы относительно Git здесь на SO - вы помогали мне много раз.
Дрю Ноакс
2
Вы даже можете обойтись без коммитов и создания .gitignore (который сам по себе не отслеживается). Откройте подмодуль .git/info/excludeи добавьте туда строки игнорирования (он работает как .gitignore, но не является частью общего репозитория).
Мартин Пека
144

Я нашел этот пост в блоге, чтобы работать в целом. Добавив ignore = dirtyопцию для каждой записи в .gitmodulesфайле.

[submodule "zen-coding-gedit3"]
    path = zen-coding-gedit3
    url = git://github.com/leafac/zen-coding-gedit3.git
    ignore = dirty
ezraspectre
источник
Мое предпочтительное решение, так как оно легко автоматизируется.
смертельная гитара
24
Стоит упомянуть, что ignore = untrackedтакже существует, и показывает измененные отслеживаемые файлы, но не неотслеживаемые файлы. Было бы неплохо, если бы для всех подмодулей была глобальная настройка ...
naught101
12

Вы также можете перейти к каждому подмодулю dir и выступать в качестве отдельного git. Например:

cd my/project/submodule
git status

... / получает список измененных файлов /

git add .  //to add all of them to commit into submodule
git commit -m "message to your submodule repo"

Вы также можете обновить удаленный репозиторий субмодулей с помощью

git submodule update

после всего

Рикардо Мартинс
источник
5
Вы, вероятно, не хотите обходиться git add .без просмотра измененных файлов. В большинстве случаев внесенные изменения - это добавленные .DS_Storeфайлы - это, вероятно, должно быть .gitignoreуловлено вами , как упомянул зортни в первом комментарии к ответу.
Грегольцов
Если вы на самом деле не хотите обновлять подмодули и хотите вернуться к исходному состоянию, вы можете запустить git submodule update --force.
Том
4

Это может быть связано с тем, что detached HEADв вашей ветке субмодулей. Если это так, перейдите в путь к субмодулю (например ./bundle/snipmate:) и запустите git checkout master.

Брауни Лин
источник
2

Вчера я застрял в этом вопросе в проекте, в котором было около 12 подмодулей.

git status показывал вывод.

# On branch master
# Changes not staged for commit:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#   (commit or discard the untracked or modified content in submodules)
#
#   modified:   proj1 (untracked content)
#   modified:   proj1 (modified content, untracked content)
#   ...

Для устранения ошибки неотслеживаемого контента, я должен был удалить неотслеживаемые файлы из всех подмодулей (все были *.pyc, *.pyoфайлы , сгенерированные питона) , используя .gitignore.

Чтобы разрешить другое, мне пришлось запустить git submodule updateобновленный каждый из подмодулей.

му 無
источник
1

В моей ситуации я клонирую модули как отправную точку для нового модуля в моей среде ZF2. Что он делает, так это помещает свою собственную папку .git в каталог.

Решением в этом случае является удаление папки .git (вам, вероятно, потребуется показать скрытые файлы, чтобы просмотреть ее).

HappyCoder
источник
1

Это, вероятно, происходит, когда у вас есть другой .git [скрытая папка] внутри конкретной папки ..

Изменено: ./../ .. (измененный контент, неотслеживаемый контент)

убедитесь, что ваш подкаталог не содержит эту папку .git.

В этом случае проблему можно решить, удалив папку .git вручную из подкаталога.

Субрат Кумар Палхар
источник
1

Я предпочитаю использовать SourceTree , поэтому для меня решение было открыть репозиторий подмодулей в SourceTree, который показывает мне список всех неотслеживаемых файлов. Я тогда группа выбрал их все, затем использовал «Удалить».

Я смог сделать это, потому что знал, что все неотслеживаемые файлы на самом деле не нужны.

Гленн Лоуренс
источник
1

Это сработало просто отлично для меня:

git update-index --skip-worktree <path>

Если это не работает с pathname, попробуйте имя файла. Дайте мне знать, если это сработало и для вас.

DarkCrazy
источник
-1

Если это временная проблема, вы можете зайти в папку субмодуля и запустить, git reset HEAD --hardно вы потеряете все свои изменения внутри субмодуля.

Дайго
источник