标记远程 git 存储库而不克隆它

问题描述 投票:0回答:4

有没有办法标记远程 git 存储库而无需在本地克隆

为了将代码存储库与配置存储库关联起来,我想(作为 CI 构建步骤)使用 build-n 标记配置存储库的当前头(其中 N 是 jenkins 提供的当前构建号)。

配置存储库不用作构建的一部分,我只是想要一种简单的方法来获取配置修订版,就像构建版本 1234 时一样,并将其标记为“build-1234”似乎是最简单的方法达到这个目的。

git tags
4个回答
15
投票

以此作为答案:目前无法使用 git 进行远程标记,但如果您可以通过某种方式访问远程(裸)存储库,则可以在远程位置进行标记。

例如,如果您通过 SSH 访问 git 仓库,则可以使用 SSH 登录,进入(裸)仓库并在(裸)仓库中执行 tag 命令(

git tag build-1234 master
)。

(我不太确定@ruslan-kabalin提到的工具)


9
投票

可以在分支尖端远程标记当前提交,但不能(据我所知)使用 git 瓷器或管道。我们必须直接与遥控器

git receive-pack
通话。

这里有一些 python 使用 dulwich 来做我们想要的事情:

#!/usr/bin/env python

from dulwich.client import get_transport_and_path
import sys


def tag_remote_branch(repo_url, branch, tag):
    client, path = get_transport_and_path(repo_url)

    def determine_wants(refs):
        tag_ref_name = 'refs/tags/%s' % tag
        branch_ref_name = 'refs/heads/%s' % branch
        # try not to overwrite an existing tag
        if tag_ref_name in refs:
            assert refs[tag_ref_name] == refs[branch_ref_name]
        refs[tag_ref_name] = refs[branch_ref_name]
        return refs

    # We know the other end already has the object referred to by our tag, so
    # our pack should contain nothing.
    def generate_pack_contents(have, want):
        return []

    client.send_pack(path, determine_wants, generate_pack_contents)


if __name__ == '__main__':
    repo_url, branch, tag = sys.argv[1:]
    tag_remote_branch(repo_url, branch, tag)

9
投票

Gitlab 有一个 API。非常有信心其他人可能对此有一个终点。 http://docs.gitlab.com/ce/api/tags.html


0
投票

已经是 2024 年了,仍然没有纯粹的远程标记选项。不过,如果您有远程服务器的 shell 访问权限,您可以执行以下操作:

git ls-remote server:/repo.git HEAD | \
    awk '{ print $1 }' | \
    ssh server 'cat > /repo.git/refs/tags/my-tag'

ls-remote
无需本地存储库即可工作,并获取
HEAD
的提交哈希(用
main
master
或您喜欢的任何内容替换)。

awk
消除散列后的混乱。

ssh
cat
获取标准输入(
awk
的输出)并将其复制到存储库的 refs/tags 文件夹中名为
my-tag
的文件中,其中存储了标签。

© www.soinside.com 2019 - 2024. All rights reserved.