将所有Git分支导出为每个分支的单独zip文件

4
我正在寻找一种方法,可以导出一个Git仓库,以便我可以单独得到每个分支的zip或目录。
这类似于执行“git export”(如“svn export”)?,但与当前分支的zip不同,我希望得到每个分支的zip。
是否有Git或Bash命令可以实现这一点?

正如toydarian的回答中指出的那样,git archive可以接受一个分支名称作为参数进行导出,因此您只需要编写一个脚本循环遍历分支名称并将它们传递给git archive即可,就像toydarian所做的那样。 - user456814
我之前询问一个命令,是因为我希望存在一种与操作系统无关的方法。像toydarians这样的脚本很有用,但在Windows上无法运行。是的,我可以编写一个兼容Windows的脚本,但我想知道是否有一个普通的命令可以实现;看起来答案是否定的。 - Kyeotic
你说它在Windows上无法运行,但你特别要求使用Bash命令。你是在使用Git Bash吗?只要使用Git Bash,即使在Windows上也应该可以运行。 - user456814
我正在使用Git Bash,但它无法工作。 $ for f in ${$(git branch)[@]:1}; do; git archive --format zip --output /out/${f}.zip $f; done,报错信息为sh.exe": syntax error near unexpected token ;'`。 - Kyeotic
第一行代码可能出现了语法错误(在Windows Git Bash中,Bash循环会起作用),我正在寻找替代方案... - user456814
2个回答

5

使用带有分支参数的git archive

git archive可以接受一个分支名称作为参数导出,因此您只需要编写一个脚本来循环遍历分支名称并将其传递给git archive。例如,在Windows Git Bash中,可以使用以下命令:

git for-each-ref --format='%(refname:short)' refs/heads | \
while read branch; do
  git archive --format zip --output <outputDirectory>/${branch}.zip $branch
done

我将它从git for-each-ref官方Linux内核文档的第二个示例进行了修改

详细说明

$ git for-each-ref --format='%(refname:short)' refs/heads
foo
master

git for-each-ref 命令将列出位于 refs/heads 下的每个本地分支,使用 refname:short 格式只显示分支名称。

这个输出被管道传到了一个 Bash 的 while 循环中,然后用分支名称替换 git archive 的参数:

while read branch; do
  git archive --format zip --output <outputDirectory>/${branch}.zip $branch
done

For循环解决方案

以下是Bash的for循环解决方案,受到toydarian(不起作用)解决方案的启发

for branch in $(git for-each-ref --format='%(refname:short)' refs/heads); do
  git archive --format zip --output <outputDirectory>/${branch}.zip $branch
done

文档


2
尝试使用此脚本。在使用脚本之前,请确保您已经检出了master
for f in ${$(git branch)[@]:1}; do
    git archive --format zip --output /path/to/dir/${f}.zip $f
done

以下是同样的命令,放在一行中,以便更容易复制、粘贴和执行:

for f in ${$(git branch)[@]:1}; do; git archive --format zip --output /path/to/dir/${f}.zip $f; done

你需要知道的是,在Windows Git Bash中,你的命令可能无法正常工作,很可能是某处存在语法错误:"sh.exe": syntax error near unexpected token ``;'"。这是一行命令的错误。"sh.exe": ${$(git branch)[@]:1}: bad substitution"。这是第一个命令的错误。 - user456814
请注意,实际上您可以复制、粘贴并成功执行您的命令的第一个版本,在终端中将所有内容放在一行上并不是必需的。 - user456814
FYI, git branch 不适合列出分支,除非您去掉显示在当前分支旁边的 *,因为 $()* 解释为文件通配符,所以它会展开当前目录中的所有文件和目录。 它是Git的“外观”命令之一,而不是像 git for-each-ref 那样的“管道”命令,后者专门用于脚本编写目的,不同于 git branch - user456814

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