2014-12-30 1 views
10

Есть ли способ заставить git не создавать index.lock для операций только для чтения, таких как git status?Git: не создавать index.lock для операций только для чтения

Я показываю статус моего рабочего дерева в tmux, обновляя каждую пару секунд. В основном я анализирую вывод git status --branch --ignored --porcelain и несколько других команд. Проблема в том, что для больших репозиториев git status может занять несколько секунд. За это время я не могу запускать какие-либо другие команды git, потому что репозиторий заблокирован.

EDIT:

Вот некоторые фотографии из соответствующей части моей tmux линии. Описание для символов слева направо:

В синхронизации с удаленной ветвью | 2 поэтапных изменения | 1 неустановленное изменение | 5 проигнорированных файлов | 1 регистрационный номер: enter image description here

В синхронизации с удаленной ветвью | никаких изменений в рабочем дереве | 5 игнорируемых файлов: enter image description here

Впереди удаленная ветка на 1 фиксации | никаких изменений в рабочем дереве | 5 игнорируемых файлов: enter image description here

+1

Хороший вопрос; 'status' блокирует индекс, чтобы он мог обновить кеш статистики. Я не вижу очевидного способа отключить это из документации, но стоит знать, что вы отказываетесь: будущие вызовы 'status' должны будут перекомпилировать работу, которая была бы кеширована. Это может быть не оптимальным в вашем скрипте. –

+0

Потеря кеширования для меня не проблема. Как я уже сказал, он используется только для отображения текущего состояния рабочего дерева. Я все время запускаю статус git. –

+0

* Я разбираю вывод 'git status'.* Вы не должны этого делать, потому что 'git status' - * фарфор * (высокий уровень). Вместо этого вы должны проанализировать вывод команд Git более низкого уровня. – Jubobs

ответ

9

Что такое использование переменной окружения «GIT_INDEX_FILE», чтобы заставить git использовать другой файл индекса?

Таким образом, чтобы создать новый индексный файл из РУКОВОДИТЕЛЯ использовать

GIT_INDEX_FILE=.git/other-index git reset 

и после него можно просто

GIT_INDEX_FILE=.git/other-index git status 

для поиска изменений.

С другой стороны, вы не увидите реального статуса, если основной индекс будет изменен командами add/rm. Но, по крайней мере, это позволит вам обнаружить факт изменения, а затем, вероятно, сделать еще несколько вещей, чтобы узнать реальную разницу.

Не могли бы вы также описать больше цели, которую вы пытаетесь достичь? Наверное, мы могли бы выступить с некоторыми другими решениями.

Другая идея. Попробуйте это:

cp .git/index .git/other-index # or maybe just "ln" once, rather than copying everytime? 
GIT_INDEX_FILE=.git/other-index git status 

Не уверен, насколько надежен этот ... в случае, если cp команда будет в то время как вы делаете git add/rm, вы могли бы «поврежденный» индексный файл, и, видимо, получить отказ, но для использования Я считаю, что это достаточно хорошо - вы можете просто проигнорировать неудачу и повторить попытку.

+0

Я добавил несколько изображений в строку состояния tmux. Все, что я действительно хочу видеть в этой строке, - это то, что представляет собой текущее состояние репозитория. Информация автоматически обновляется каждые пару секунд. Поэтому теоретически я могу следить за изменениями в «реальном времени». –

+0

@keks, я обновил свой ответ с идеей 'cp'. Пожалуйста, попробуйте сказать, хорошо ли это работает, мне любопытно. – kan

+0

Похоже, cp-версия работает так, как ожидалось. До сих пор я не сталкивался с какими-либо проблемами. Даже если поврежденный индекс будет скопирован, это не так уж плохо. К тому времени, когда я заметил бы ошибку, статус уже был бы обновлен. –

4

Быстрое и грязное, но наиболее безопасно вы можете просто использовать пользователя с разрешениями только для чтения.

sudo -u nobody git status 

 Смежные вопросы

  • Нет связанных вопросов^_^