Отказ от ответственности : Я не прошу решения, обходного пути или какого-либо совета о том, как что-то делать, мне просто любопытно узнать о внутренностях 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:
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 считает эти файлы модифицированными.