【问题标题】:How do I check if a file exists in a remote?如何检查远程文件中是否存在文件?
【发布时间】:2011-05-07 07:25:58
【问题描述】:

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

【问题讨论】:

    标签: git git-remote


    【解决方案1】:

    你可以使用

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

    当文件存在时,它将以零退出。而不是上面的&lt;remote&gt;,您将使用远程分支名称(但它实际上可以是任何树状对象引用)。要使用这样的远程分支,您需要配置和获取远程存储库(即使用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
    

    需要注意的两点:

    • 使用/ 作为文件名中的路径分隔符,即使在例如窗户。
    • &lt;filename&gt; 是相对于存储库根目录的完整路径(例如 foo/bar/README)。

    【讨论】:

    • &lt;remote&gt; 指的是远程分支,这意味着您必须先配置远程并运行git fetch &lt;remote&gt;;您正在检查 repo 中的远程分支,因此您需要确保它是最新的。
    • 您好@earl 感谢您的回答,但我不明白为什么在这种情况下它不能正常工作。我已经成功地从远程存储库中删除了.idea/ 文件夹,但不是在本地使用代码git rm --cached -rf .idea还在远程存储库上吗?
    【解决方案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'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
    

    【讨论】:

    • 被警告:git-archive 解决方案不能可靠地工作。它似乎只检查顶级文件/目录的存在,例如:git archive --remote=&lt;repo&gt; master dir-that-exists/then/some/nonsense/path 将退出 0
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多