Как проверить, существует ли файл на удаленном компьютере? - PullRequest
15 голосов
/ 09 ноября 2010

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

Ответы [ 2 ]

23 голосов
/ 09 ноября 2010

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

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) относительно корня хранилища.
7 голосов
/ 09 ноября 2010

Вы можете использовать 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's master has README"
else
  echo "repository's 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's master has README"
else
  echo "remote's master does not have README"
fi
...