gpt4 book ai didi

git - 无需克隆即可列出和删除 git 分支

转载 作者:太空狗 更新时间:2023-10-29 12:45:16 25 4
gpt4 key购买 nike

for k in $(git branch -r --merged origin/master | cut -d" " -f 3); do
echo $k
done

我有一个 git 项目列表,我想清理其中的旧分支,我想做的是列出并删除所有 merge 到 master 的分支。

有没有办法在不在本地克隆每个 repo 的情况下执行上述操作?

最佳答案

你需要git ls-remote :

NAME

git-ls-remote - List references in a remote repository

SYNOPSIS

git ls-remote [--heads] [--tags] [--refs] [--upload-pack=<exec>]
[-q | --quiet] [--exit-code] [--get-url]
[--symref] [<repository> [<refs>...]]

DESCRIPTION

Displays references available in a remote repository along with the associated commit IDs.

所以它的工作原理是这样的:

% git ls-remote origin
af51dfb080728117d898e1d0a10e3fe01ed67063 HEAD
6a60cc68a2953f1a62b0dca641eb29509b5b6e8c refs/heads/expdate-fix
af51dfb080728117d898e1d0a10e3fe01ed67063 refs/heads/master
4c42e43b4ccfd37074d115f6e9a694ddb8b70d55 refs/heads/redux
fd18a67bbc5cbf8aa6cda136afa4e5c20ed2d522 refs/heads/rest
7ad17cdf8b0dcd1a29a1795a363279fb3c76ac66 refs/tags/test.key
be0b2d6881902600fb3d6686c10d0a47f1e6751a refs/tags/test.pub

要仅获取分支(头),您需要缩小 refspec 的范围:

% git ls-remote origin 'refs/heads/*'
6a60cc68a2953f1a62b0dca641eb29509b5b6e8c refs/heads/expdate-fix
af51dfb080728117d898e1d0a10e3fe01ed67063 refs/heads/master
4c42e43b4ccfd37074d115f6e9a694ddb8b70d55 refs/heads/redux
fd18a67bbc5cbf8aa6cda136afa4e5c20ed2d522 refs/heads/rest

现在您可以围绕此输出编写脚本,例如

git ls-remote origin 'refs/heads/*' | while read sha ref; do
# test if $sha is merged
done

要删除一个分支,你需要“不推送任何东西”给它,就像在

git push origin :refs/heads/feature-x

(注意“:”左侧的空字符串,它定义了将什么推送到右侧的内容)。

所以我们得到类似的东西

#!/bin/sh
set -e -u
git ls-remote origin 'refs/heads/*' | while read sha ref; do
# test if $sha is merged
E=`git cat-file -t "$sha" 2>&1`
test $? -ne 0 -a "${E#*git cat-file: *}" = "could not get object info" && continue
git branch --merged "$sha" && printf ':%s\0' "$ref"
done | xargs -0 git push origin

请注意,我们使用的是 printf shell 内置来分隔我们用 ASCII NUL 字符输出的 refs 的名称,然后传递 -0xargs期待以 NUL 结尾的输入。这样我们就可以解决时髦的引用名称(包含空格等)。

一些解释:

  • 如果 git cat-file -t <object_sha1_name>找不到对象在本地存储库中使用指定的 SHA1 名称,它以非零退出代码退出并打印

    fatal: git cat-file: could not get object info

    到它的标准错误。

  • 所以要测试远程引用指向的历史是否存在于本地我们运行的存储库 git cat-file -t在对象的 SHA1 名称上指向,获取该命令的组合输出,然后进行测试它是否以非零退出代码 ( $? -ne 0 ) 退出,并且它的错误消息是否表明缺少对象(${VAR#PATTERN} 从内容中删除匹配 PATTERN 的前缀变量 VAR并返回结果值)。

  • 如果远程 ref 指向的历史记录在本地存储库中不存在,则不能根据定义将其 merge 到任何本地 refs,所以如果我们检测到这样的引用,我们将跳过它的进一步测试 git branch --merged .

关于git - 无需克隆即可列出和删除 git 分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41956786/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com