如何检查遥控器中是否存在文件?

zaz*_*aza 15 git git-remote

有没有办法检查遥控器中是否存在指定的相对路径下的文件?如果它是唯一的选择,我可以先获取信息.换句话说,我正在寻找带有指定远程和分支选项的git-ls文件.我只对文件存在感兴趣(分支上的文件列表也会这样做),我不关心哈希,差异等.

ear*_*arl 23

您可以使用

git cat-file -e <remote>:<filename>
Run Code Online (Sandbox Code Playgroud)

当文件存在时,它将以零退出.而不是<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
Run Code Online (Sandbox Code Playgroud)

有两点需要注意:

  • 使用/在文件名路径分隔符,即使是在如Windows.
  • <filename>foo/bar/README相对于存储库根目录的完整路径(例如).

  • “&lt;remote&gt;”指的是远程分支,这意味着您必须先配置远程并运行“git fetch &lt;remote&gt;”;您正在检查存储库中的远程分支,因此您需要确保它是最新的。 (2认同)

Chr*_*sen 7

您可以使用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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

如果您为存储库定义了远程,那么您可能只想更新它并通过正常的远程跟踪分支访问该文件:

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
Run Code Online (Sandbox Code Playgroud)