Отказ от ответственности: я не прошу решения, обходного пути или каких-либо советов о том, как что-то делать, мне просто любопытно узнать о внутренностях Mercurial.
У меня есть репозиторий mercurial с некоторым подрепозиторием (Git и Mercurial).
- Мой репозиторий и все субрепозитории находятся в чистом состоянии (то есть:
hg st -S
ничего не возвращает). - Я делаю некоторые агрессивные изменения разрешений в корне:
chown www-data:www-data -R *
Теперь hg st -S
возвращает каждый файл вложенных репозиториев Git (файлы Mercurial по-прежнему считаются «чистыми») как измененные. Выход hg diff -S -g
пуст. Мне было интересно, почему это произошло?
Что я обнаружил до сих пор:
- Если я сделаю
git status
в одном из подрепозиториев, команда не покажет никаких ожидающих изменений, и это конкретное репо больше не будет помечено как измененноеhg st
- Если я ограничу изменения разрешений субрепозиторием, только это субрепозиторий будет помечено как измененное (т. е. «проблема» не связана с состоянием файла в каталоге
.hg
) - Выполнение чистого обновления (
hg up -C
) «решает» проблему - Если я изменю разрешение только в каталоге
.git
, подрепозиторий по-прежнему будет считаться чистым. - Вывод
hg --debug up -C
отличается для подрепозитория Git, помеченного как измененный:
«чистый» репозиторий git:
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
, diff пуст. Я до сих пор понятия не имею, почему git считает эти файлы измененными.