GIT:有没有一种方法可以在多个仓库上提交代码?

13

我知道这不是推荐的做法,但是我有一些包含多个项目的文件夹,我想让它们保持最新。

有没有一条命令可以查找文件夹中的每个git存储库并发送以下命令..

git add -u 
git add .
git commit -m 'Latest'

所以我只需要进入某个文件夹,然后运行一个命令来更新它们所有的内容吗?

这不是有关子模块的问题。


1
可能答案是一个 .sh 文件。 - Kirk Strobeck
1
虽然有方法可以做到这一点,但我甚至不建议为单个存储库执行上述操作,更不用说一堆存储库了。我认为将您的提交视为“小型代码审查”在保持干净历史记录方面非常有帮助 - 这在长期的代码维护中非常有帮助:跨版本修复错误,删除不需要的补丁等。 - vhallac
1
你真的没有看到我写的第一件事吗?! - Kirk Strobeck
我做到了。但我讨厌在带有随机提交的存储库上工作,因此我无法阻止自己在各处添加上述评论。 :) - vhallac
4个回答

9
为什么不使用这样的东西:
#!/bin/bash
for DIR in `ls`;
do
    if [ -d $DIR/.git ];
    then
            echo "updating location: " $DIR;
            cd $DIR
            # your commands here...
            git add -u 
            git add .
            git commit -m 'Latest'

            cd ..
    fi
done

你能让它变成复制粘贴吗?我不确定如何添加我的命令:\ - Kirk Strobeck
@Kirk:我希望你在使用*nix系统,这样你只需要把灰色框中的命令文字放在“#你的命令在这里...”和“cd ..”之间即可。 - Scolytus
1
@Scolytus 在 Windows 上,它应该也可以在 mingw(已测试)和 msysgit(未测试)上工作。 - maiklos
哦,它总是带有/bin/bash吗?好的,我知道了...我猜你也必须告诉Windows如何执行脚本或从mingw shell中执行它,对吧? - Scolytus
第一行是为了让shell知道要使用哪个解释器。如果代码与其兼容,您可以使用任何喜欢的shell。如果您从mingw中运行它,它将正常工作,因为mingw有/bin/bash。 - maiklos
“-u” 添加了提交的删除。可以添加 git push,但我想象中它会由于连接服务器时的时间问题而失败。解决方法可能是 sleep()。 - Timo

5
也许你正在寻找类似于 mr 的东西(主页)。我使用它来一次更新一堆仓库,但也可以配置为执行任何你想要的任务。它也作为Ubuntu和Debian官方仓库中的软件包提供。否则,你可以编写一个脚本来完成你想要的任务。

听起来很有前途,我可以安装源代码,然后放弃Subversion(iihh)吗?在您的网站上,您提供git clone,这是用来做什么的? - Timo

2
免责声明:这是我自己的代码,如果你使用或者fork它,我不会从中获得任何财务利益,但是它是为了应对这种情况而编写的,也许可以帮助到你。 ;)
我写了一个名为gitglue的工具。你可以为仓库打标签,并基于标签执行任意命令。请查阅关于gitglue的这篇教程,或者在Github上forkgitglue

1
我使用一个bash脚本(在我的.bashrc中)来在多个存储库上运行相同的git命令。bash硬编码了存储库位置,但很容易更改。运行多次相同命令的问题之一是正确传递带引号的"参数,通常是-m "commit message" 我像这样运行这些命令: mgit commit -a -m "my commit message"其中mgit是我.bashrc中的别名。
这适用于任何git命令(至少是我测试和日常使用的命令),例如: mgit status -unomgit pull 解析git参数的函数
此函数确保正确处理任何带引号的参数(在-m之后)。
parse_git_args()
{
    git_args=""
    end_comment=""
    for var in "$@"
    do
        if [[ $var == '-m' ]];
        then
            git_args+=" -m \""
            end_comment="\"" 
        else
            git_args+=" $var"
        fi
    done
    git_args+=$end_comment

    echo $git_args
}

在多个仓库上运行相同命令的函数

multiple_git_func()
{
    start=$(pwd)
    git_args=$(parse_git_args $@)
    root=`git rev-parse --show-toplevel` #find the repo from which the command was run

    # go to root apply command and then go to sub repos (hardcoded location wrt root)
    cd $root
    echo "=============================="
    echo "issuing git $git_args on $root"
    eval "git $git_args"


    cd repo2 # repo2 is installed in root, could be anywhere else relative to root
    echo "=============================="
    echo "issuing git $git_args on repo2"
    eval "git $git_args"
   
    #go back to initial folder
    cd $start
}

.bashrc中的别名

alias mgit=multiple_git_func


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