Ваш администратор прав, если у вас есть одна общая ОС между узлами в кластерной файловой системе и кластеризация не удалась, все узлы не работают, так как они не смогут получить доступ к важным файлам, необходимым для работы.
Вы также правы, если каждый узел имеет свою собственную ОС и кластеризация не удалась, вы должны потерять доступ только к файлам внутри кластера, так как необходимые файлы операционной системы будут локальными. Вы не упоминаете, какую кластеризацию вы используете, поэтому могут потребоваться дополнительные механизмы, чтобы гарантировать, что неисправный кластер не приведет к зависанию системы.
Похоже, что ваша кластеризация по-прежнему будет единственной точкой отказа для общих файлов, но если она не отключает целые хосты, ваш администратор может почувствовать себя лучше.
Лучшее решение, которое я нашел до сих пор, состоит в том, чтобы создать список путей для перехода к git add
путем явного изучения индекса git и рабочего дерева.
Учитывая репозиторий:
git init.
echo $RANDOM > ignore-edited
echo $RANDOM > ignore-deleted
echo $RANDOM > add-edited
echo $RANDOM > add-deleted
git add.
git commit -m 'Initial commit'
echo $RANDOM > ignore-new
echo $RANDOM > ignore-edited
rm ignore-deleted
echo $RANDOM > add-new
echo $RANDOM > add-edited
rm add-deleted
и список файлов для обновления:
printf '%s\n' add-new add-edited add-deleted add-nonexistent | sort \
> /tmp/filelist.txt
Мы можем создать список файлов, получив объединение между пересечением наших файлов, которые нужно добавить, и индексом, и пересечением наших файлов, которые нужно добавить, и теми, которые существуют в рабочем дереве:
comm -12 /tmp/filelist.txt <(git ls-files) \
> /tmp/files-in-index.txt
while read -r line ; do test -e "$line" && printf -- '%s\n' "$line" ; done < /tmp/filelist.txt \
> /tmp/files-in-worktree.txt
sort -um /tmp/files-in-index.txt /tmp/files-in-worktree.txt \
> /tmp/files-to-add.txt
< /tmp/files-to-add.txt xargs git add
Или, в одном вызове:
sort -um \
<(comm -12 /tmp/filelist.txt <(git ls-files)) \
<(while read -r line ; do test -e "$line" && printf -- '%s\n' "$line" ; done < /tmp/filelist.txt) |
xargs git add