如何检查远程文件是否存在?

26

有没有一种方法可以检查远程指定相对路径下的文件是否存在?如果这是唯一的选择,我很乐意先获取信息。换句话说,我正在寻找具有指定远程和分支选项的git-ls-files。我只关心文件是否存在(分支上的文件列表也可以),我不关心哈希值、差异等。

2个回答

34

你可以使用

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

需要注意的两点:

  • 在文件名中使用 / 作为路径分隔符,即使在 Windows 系统上也要如此。
  • <filename> 是一个完整的路径(例如 foo/bar/README),相对于代码库的根目录。

2
“<remote>”指的是远程分支,这意味着您必须先配置远程并运行“git fetch <remote>”;您正在检查存储库中的远程分支,因此需要确保其为最新状态。 - Cascabel
你好 @earl ,感谢你的回答,但我无法理解为什么在这种情况下它不能正常工作。 我已成功地从远程存储库中删除了.idea/文件夹,但是无法使用代码在本地删除 git rm --cached -rf .idea 然后我尝试查看是否仍在远程存储库中,使用以下代码 git cat-file -e origin/branch:./.idea 它返回0,这意味着.idea/仍在远程存储库中? - Zhirayr

10
你可以使用 git archive 来访问仓库中的单独文件,而无需下载其他任何部分:

您可以使用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

1
请注意:git-archive解决方案不可靠。它似乎只检查顶层文件/目录的存在性,例如:git archive --remote=<repo> master dir-that-exists/then/some/nonsense/path将以0退出。 - Torben Knerr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接