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

Git целостность файла

Недавно моя основная машина, которую я использую для разработки, начала перегреваться. Я начал получать 4 или 5 блокировок в день. Все замораживается. Все мои проекты находятся под контролем версий с помощью git.

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

ОС - файловая система Mac OS X 10.4 - это HFS +.

4b9b3361

Ответ 1

Вы можете заставить Git проверить весь репозиторий git fsck. Если репозиторий Git поврежден, вы должны получить новый клон из не поврежденного репозитория.

При нормальной работе Git следует проверять части репозитория по мере их чтения, поэтому может потребоваться больше времени, чтобы заметить некоторое повреждение, но в первый раз вы заметите, что пытаетесь получить доступ к поврежденным данным.

Ответ 2

Что сказал Линус, когда он сказал, что Git гарантирует, что файлы не повреждены, он имел в виду тот факт, что когда вы ссылаетесь на конкретную фиксацию (идентифицированную ее хэшем), вы гарантированы что он будет всегда ссылаться на то же самое состояние репозитория. Если вы и вытащите ядро ​​linux из дерева Linus, и он ссылается на некоторый commit ae6bcd1..., вы ничего не можете сделать (даже в своем локальном репозитории) когда-либо сделать commit ae6bcd1... выглядят иначе, чем что Линус смотрит на него, когда ссылается на него.

Кроме того, поскольку объект фиксации содержит ссылки на (все) его родительские фиксации (ы), когда вы ссылаетесь на фиксацию, вы также гарантируете ее полную историю в DAG.

Что касается искажения файлов, то это своего рода независимая проблема; но без искажения реальных объектов blob (т.е..git/objects/ob/ject_hashname), если один из файлов рабочих деревьев поврежден, вы сможете восстановить его из предыдущего состояния фиксации или из состояния индекса/кэширования.

В этом случае вы никогда не сможете испортить удаленный доступ, если вы не выполняете принудительные нажатия (которые перезаписывают историю на пульте), так как push гарантирует, что объекты commit образуют непрерывный график истории.

Ответ 3

Недавно мне пришлось проверять репозитории на сервере, который разбился, я использовал следующую команду:

for gitdir in  $(sudo find / -name ".git" -type d -printf "%h "); do
  cd $gitdir && ( git fsck && echo "${gitdir} - "'HAPPY !' ) \
  || echo "${gitdir} - "'ERROR !';
done