Как проверить, находится ли каталог в рабочем дереве git, если этот каталог не является текущим рабочим каталогом?

Оба резервного хранилища и сохранения в являются атрибутами/флагами, которые можно установить при создании окна с помощью XCreateWindow(). Тем не менее, это всего лишь подсказки для сервера X11, они не включены по умолчанию и на самом деле не стоят проблем с современным оборудованием.

Как правило, когда (часть )фонового окна становится видимой, сервер X11 отправляет событие Exposeклиенту X11, что должно привести к его перерисовке. Поскольку это всего лишь подсказки, сервер X11 может по-прежнему отправлять Expose, даже если клиент установил как .backing_store = Alwaysв окне, так и CWSaveUnderво всплывающих окнах, которые он открывал поверх него.

Существуют также интерфейсы, которые позволяют клиенту запрашивать, реализует ли сервер резервное хранилище и сохранение в:XDoesBackingStore()и XDoesSaveUnders().

Оконный менеджер не имеет ко всему этому никакого отношения; он не перерисовывает никаких окон (, кроме собственных :заголовков, кнопок закрытия ).

1
09.04.2021, 11:05
3 ответа

Просто используйте глобальную опцию-Cдляgit. Делая это и упрощая свой код (, зачем вам анализировать вывод для восстановления информации, которая непосредственно закодирована в статусе возврата?):

directory=. # or wherever
if git -C "$directory" rev-parse --is-inside-work-tree >/dev/null 2>/dev/null; then
  echo yes
fi
2
28.04.2021, 22:53

Я подозреваю, что самый простой вариант — временно перейти в каталог:

(cd /path/to/target && [[ $(git rev-parse --is-inside-work-tree) == true ]]) 2> /dev/null && echo yes
1
28.04.2021, 22:53

Я бы сделал это с помощью функции, которая перемещается в целевой каталог, запускает там команду и возвращает результат:

isGitDIr(){
    for dir in "$@"; do
    ( 
        cd "$dir" || return
        [[ $(git rev-parse --is-inside-work-tree 2> /dev/null) == true ]] && 
        echo "yes"
    )
    done
}

Круглые скобки заставляют команды выполняться в подоболочке, поэтому, когда функция завершится, вы не изменили каталог родительской оболочки. Добавьте строки в файл инициализации вашей оболочки (, например.~/.bashrc)или вставьте прямо в свой терминал, и вы можете сделать:

isGitDIr /path
1
28.04.2021, 22:53

Теги

Похожие вопросы