Целостность Git-файла - PullRequest
29 голосов
/ 08 июня 2009

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

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

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

Ответы [ 3 ]

36 голосов
/ 08 июня 2009

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

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

9 голосов
/ 16 июня 2009

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

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

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

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

6 голосов
/ 21 октября 2011

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

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