【问题标题】:git sparseCheckout and rev-list commandgit sparseCheckout 和 rev-list 命令
【发布时间】:2020-07-17 12:44:49
【问题描述】:

我正在尝试在我已设置稀疏结帐的存储库中使用 git rev-list 命令。 回购设置如下:

mkdir -p /opt/apcu
git -C /opt/apcu/ init
git -C /opt/apcu/ remote add -f origin git@github.com:krakjoe/apcu.git
git -C /opt/apcu/ config core.sparseCheckout true
echo "apc.php" >> /opt/apcu/.git/info/sparse-checkout
git -C /opt/apcu/ config branch.master.remote origin
git -C /opt/apcu/ config branch.master.merge refs/heads/master
git -C /opt/apcu/ pull origin

现在我想检查 repo 中的任何更改:

$ git rev-list HEAD...origin
fatal: ambiguous argument 'HEAD...origin': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

知道为什么会出现上述错误吗?

这是我失败的 bash 脚本。这个想法是检查远程存储库的任何更改,然后将它们拉下来。我在检查提交时遇到麻烦的原因是脚本中的另一个函数根据更新的内容运行安装。

# Do not fetch or pull "master" this is not always the default branch you have checked out.
# Omitting the branch to fetch or pull will pull the default.
for i in "${repo_array[@]}"; do
    git -C "$i" fetch origin &>/dev/null
    # Get rid of errors because git reports differences in repo as errors.
    commits=$(git -C "$i" rev-list HEAD...origin --count 2>/dev/null)

    if (( commits != 0 )); then
        git -C "$i" pull origin &>/dev/null
        # Run the installer function to install new versions
        installer
    fi
done 

【问题讨论】:

    标签: git github


    【解决方案1】:

    注意origin 可以表示origin/HEAD可以是指向您的其他origin/*远程跟踪名称之一的符号引用。如果origin/HEAD 存在,并且您按照自己的方式使用名称origin1 请参阅the gitrevisions documentation,尤其是解析修订说明符的六步过程;请注意,步骤 6 包括将 ref/remotes/ 添加到前面,将 /HEAD 添加到末尾,无论您提供什么名称并尝试查找它。

    运行git remote add origin 后,您可以运行git remote set-head origin(使用您喜欢的任何选项)来设置refs/remotes/origin/HEAD 符号引用。但除非您真的想查询远程 Git 以设置您的 refs/remotes/origin/HEAD 以匹配他们的 HEAD,否则几乎可以肯定要好得多只使用显式 origin/masterorigin/other-specified-name,这里.事实上,在脚本中使用完全限定的名称是明智的:例如,refs/remotes/origin/master

    不过,在分支名称上使用 @{upstream}@{u} 修饰符可能是您最好的选择;见VonC's answer


    1HEAD..origin 这样的复合项目中的说明符共有三个标记:HEAD..origin。 “单独”是指您以这种方式使用origin 作为令牌,而不是作为origin/master 等更大令牌的一部分。你也可以在这里写,例如origin~12;这三个令牌是origin~12。虽然 Git 的修订解析器是临时的,而不是使用带有 lexemes 的正式语法,但它功能就像一个。

    【讨论】:

      【解决方案2】:

      origin 不是引用,而是远程 URL

      例如:origin/master 将是对上次获取的远程 master HEAD 的引用。

      git rev-list HEAD...origin/master
      

      在你的情况下,由于 master 并不总是你要拉的分支,你会使用:

      commits=$(git -C "$i" rev-list HEAD...@{u} --count 2>/dev/null)
      

      @{u}(或@{upstream})是与当前分支关联的上游分支的快捷方式。

      【讨论】:

      • 所以如果我有一个与master 不同的分支签出,我需要这样做:git rev-list HEAD...origin/v3.3/dev
      • @steveH 获取后,是的:stackoverflow.com/a/10685691/6309。拉动之后,这更棘手:stackoverflow.com/a/12631371/6309
      • 我更新了我的问题以帮助显示我正在尝试运行的代码。感谢所有的帮助。
      • @steveH 我知道:我已经相应地更新了答案。
      猜你喜欢
      • 2021-10-23
      • 2021-01-31
      • 2019-09-20
      • 1970-01-01
      • 2021-06-10
      • 1970-01-01
      • 2022-12-11
      • 2017-01-18
      • 1970-01-01
      相关资源
      最近更新 更多