Как проверить, существует ли файл на удаленном компьютере?

Есть ли способ проверить, существует ли файл с указанным относительным путем на удаленном компьютере? Я в порядке, сначала получаю информацию, если это единственный вариант. Другими словами, я ищу git -ls файлы с возможностью указания удаленного и ветки. Мне просто интересно, существует ли файл (список файлов на ветке тоже будет работать), мне не нужны хэши, diff и т.д.

Ответы

Ответ 1

Вы можете использовать

git cat-file -e <remote>:<filename>

который выйдет с нулем, когда файл существует. Вместо <remote> выше вы используете имя удаленной ветки (но на самом деле это может быть любая ссылка на объект дерева). Чтобы использовать такую ​​удаленную ветвь, вам нужно настроить и извлечь удаленный репозиторий (т.е. С помощью git remote add + git fetch).

Конкретный пример:

$ git cat-file -e origin/master:README && echo README exists
README exists

$ git cat-file -e origin/master:FAILME
fatal: Not a valid object name origin/master:FAILME

Следует отметить две вещи:

  • Используйте / как разделитель путей в именах файлов, даже напр. Окна.
  • <filename> - полный путь (например, foo/bar/README) относительно корня репозитория.

Ответ 2

Вы можете использовать git archive для доступа к отдельным файлам без загрузки какой-либо другой части репозитория:

if git archive --format=tar \
               --remote=<remote_name-or-URL> master README >/dev/null; then
  echo 'master has README'
else
  echo 'master does not have README (or other error)'
fi

Служба архивации (upload-archive) может быть не включена на всех серверах или репозиториях, но вам придется протестировать ее для серверов и репозиториев, которые вам нужны для доступа.

Если служба архива недоступна, вам придется извлекать объекты с помощью обычных средств.

Если у вас еще нет удаленной настройки для данного репозитория, вы можете сделать "мелкую" выборку в FETCH_HEAD (это нужно сделать в репозитории Git, но оно может быть полностью несвязанным или даже пустым)

git fetch --depth=1 remote_name-or-URL master
if git rev-parse --verify --quiet FETCH_HEAD:README >/dev/null; then
  echo "repository master has README"
else
  echo "repository master does not have README"
fi

Если у вас есть пул, определенный для репозитория, вы, вероятно, просто хотите его обновить и получить доступ к файлу через обычные ветки удаленного отслеживания:

git fetch remote_name
if git rev-parse --verify --quiet remote_name/master:README >/dev/null; then
  echo "remote master has README"
else
  echo "remote master does not have README"
fi