Внутренние Mercurial: статус Git-субпозитория после агрессивного изменения прав - PullRequest
2 голосов
/ 17 ноября 2011

Отказ от ответственности : Я не прошу решения, обходного пути или какого-либо совета о том, как что-то делать, мне просто любопытно узнать о внутренностях Mercurial.

У меня есть ртутный репозиторий с каким-то субпозиторием в нем (Git и Mercurial).

  1. Мой репозиторий и все вложенные репозитории находятся в чистом состоянии (то есть: hg st -S ничего не возвращает).
  2. Я делаю некоторые агрессивные изменения прав доступа в корне: chown www-data:www-data -R *

Теперь hg st -S возвращает каждый файл подпунктов Git (Mercurial по-прежнему считается «чистым») как измененный. Выход hg diff -S -g пуст. Мне было интересно, почему это произошло?

То, что я обнаружил до сих пор:

  1. Если я сделаю git status в одном из подпунктов, команда не покажет ожидающих изменений, и этот конкретный репозиторий больше не помечается как измененный hg st
  2. Если я ограничиваю изменения разрешений для подпредложения, только этот подпункт помечается как измененный (т. Е. «Проблема» не связана с состоянием файла в каталоге .hg)
  3. Чистое обновление (hg up -C) "решает" проблему
  4. Если я изменю разрешение только в каталоге .git, подпункт все равно будет считаться чистым
  5. Вывод hg --debug up -C отличается для подпункта Git, помеченного как измененный:

«чистый» git subrepo:

subrepo/git1: git config --bool core.bare 
subrepo/git1: git rev-parse HEAD
subrepo/git1: git diff-index --quiet HEAD

«модифицированный» git subrepo:

subrepo/git2: git config --bool core.bare
subrepo/git2: git rev-parse HEAD
subrepo/git2: git diff-index --quiet HEAD
  subrepo subrepo/git2: other changed, get git://github.com/XXXX/YYYY.git:6f2442d36bb44724af116b97c85d2e344fc9a0a2:git
subrepo/git2: git cat-file -e 6f2442d36bb44724af116b97c85d2e344fc9a0a2
subrepo/git2: git config --bool core.bare
subrepo/git2: git rev-parse HEAD
subrepo/git2: git reset HEAD
subrepo/git2: git reset --hard HEAD

Итак, насколько я могу судить, изменение разрешений в метаданных здесь не является причиной, так что же? Я, наверное, просто упускаю что-то действительно простое.

К вашему сведению, я использую версию 1.9.3, и я не помню, отмечал ли я тот же самый компартмент в предыдущем.

И прежде, чем кто-то предложит мне прекратить делать изменение разрешения, я уже сделал это, и я больше не сталкиваюсь с этой проблемой, просто мне нравится понимать, почему что-то происходит;)

Обновление

работает git diff-index HEAD дает следующий вывод:

[...]
:100644 100644 fef0f187a5eabc82dc1a90661bd86d317114e40e 0000000000000000000000000000000000000000 M      my/file/insubrepo.php
[...]

Если я запускаю git diff-index -p HEAD, разница пуста. Я до сих пор не понимаю, почему git считает эти файлы модифицированными.

1 Ответ

2 голосов
/ 18 ноября 2011

Вероятная проблема (с потенциальным решением):

Изменение режима файла изменит статистику файла относительно индекса Git (как отмечено здесь ).

Чтобы исправить проблему, попробуйте:

  1. Навигация к вашему Git sburepo
  2. Выполнить git update-index --refresh

Это должно исправить грязную статистику файла.


Справочная информация о внутренних органах Mercurial:

Чтобы определить, является ли подпункт Git грязным (т. Е. Имеет локальные модификации), Mercurial запускает git diff-index --quiet HEAD.

См. dirty метод subrepos.py::gitsubrepo.

Я ожидаю, что после того, как вы измените разрешения, git diff-index покажет изменения, которых не выполняет ваше ручное выполнение git status.

Вывод git diff-index отформатирован следующим образом (подробнее см. man-страницу ):

:<mode before> <mode after> <status> <file>

Учитывая вывод, который вы перечислили выше, это говорит о том, что: «Файл my/file/insubrepo.php был изменен в рабочей копии, но режим файла такой же».

...