pipe理许多git存储库

在git中build立一个项目很容易,所以即使对于小脚本我也可以有单独的仓库。 现在的问题是如何pipe理它们。

我在这些仓库的多个地方工作。 当我对某个存储库进行更改时,我希望能够更新其他地方的存储库。

所以我有一个在其中有许多存储库的目录。

  1. 我如何获取所有这些?
  2. 我怎样才能检查其中是否有任何未经承诺的更改?
  3. 我如何检查他们中的任何人是否有合并的变化?

如果能够用一个命令来完成这些,那将是很好的。

输出需要保持沉默,才能真正注意到要做的事情。

我强烈build议使用多个存储库工具先生 。 我曾经使用其他人推荐的自定义shell脚本,但使用mr对我有以下好处:

  • 它是通用的:可以使用各种版本控制系统的联合,而不仅仅是git(例如Mercurial,SVN等)。
  • 这很快:mr可以并行执行多个作业。 我使用了一些git / mercurial存储库,并且每天同步它们几次。 Mr极大地加快了这个过程。
  • pipe理存储库检出列表非常简单,快捷。 只需使用“mr register”而不是修改自定义脚本中的项目列表。

关于无声输出的问题:可以使用命令行开关-q修改冗长级别。 我更喜欢默认的输出,看起来很好地统一输出在一个简短的和明确的总结。

我使用mr命令的以下别名,以确保mr总是选取我的默认项目列表存储在$ HOME中,并使用5个并行线程:

alias mr='mr -d ~/ -j 5 ' 

我必须说,我从目前接受的答案开始(只是一堆遍历存储库的助手脚本),但总而言之,这对我来说是一个缺乏经验的东西。

所以,在试过mr,repo和git-submodules之后,我发现每个都有不同的方式,所以我最终做了自己的变体: http : //fabioz.github.io/mu-repo这是一个成熟的工具这一点,工作stream程,允许克隆多个回购,区分(和编辑)他们,预览传入的变化,等等。

gr (git-run)扩展了mr的function(仅适用于git )。 我发现使用其标签系统组织多个git回购更容易。 gr的代码虽然维护得不好。 如果你使用的是bash,确保你使用-t tag而不是#tagforms。

您可以尝试使用自定义manifest.xml文件的repo来指定您的存储库的位置。 有一些关于如何做到这一点的文件。

或者你可以使用git-submodule(1 ) 。

gitslave是一个工具,它可以通过在super和subs之间创build超级项目/子项目关系来在许多存储库上运行相同的命令。 这(默认情况下)提供输出汇总,所以你可以专注于提供独特的输出(git状态有用,不是很有用的git ls文件)的存储库。

这通常用于需要将多个存储库组装在一起并将它们同时或同时保存在同一分支或标记中的项目。 对于(裸)存储库的目录,我只是有一个makefile,它可以让我运行任意的git命令,正如你看到的,我主要用于fsck和gc:

 full: fsck-full gc-aggressive @: fsck-full: for f in */.; do (cd $$f; echo $$f; git fsck --full || echo $$f FAILED); done gc-aggressive: for f in */.; do (cd $$f; echo $$f; git gc --aggressive || echo $$f FAILED); done %: for f in */.; do (cd $$f; git $@ || echo $$f FAILED); done 

我使用这个脚本来轻松地在我所有的仓库中执行git命令。

 #!/bin/sh if [ ! "$1" = "" ] ; then if [ "$GITREPO" = "" -a -d "$HOME/cm/src" ] ; then GITREPO="$HOME/cm/src" fi if [ "$GITREPO" != "" ] ; then echo "Git repositories found in $GITREPO" echo "-=-=-=-=-=-=-=-=-=-=-=-=-=-" DIRS="`/bin/ls -1 $GITREPO`" for dir in $DIRS ; do if [ -d $GITREPO/$dir/.git ] ; then echo "$dir -> git $1" cd $GITREPO/$dir ; git $@ echo fi done else echo "Git repositories not found." fi fi 

默认情况下,脚本将在〜/ cm / src中查找git存储库,但是可以通过设置GITREPO环境variables来覆盖此脚本。

该脚本基于此脚本 。

我刚刚创build了一个工具,做你想做的!

  1. 我如何获取所有这些? gmaster fetch
  2. 我怎样才能检查其中是否有任何未经承诺的更改? gmaster status
  3. 我如何检查他们中的任何人是否有合并的变化? gmaster status

它被称为gitmaster: https : //github.com/francoiscabrol/gitmaster

你可以使用这个git-status-all gem: https : //github.com/reednj/git-status-all

 # install the gem gem install git-status-all # use the status-all subcommand to scan the directory git status-all 

在显示状态之前,还有一个fetch选项可以从所有存储库的原始数据获取:

 git status-all --fetch 

git状态全部

你应该在CPAN上检查rgit ,recursion执行目录树中所有存储库上的git命令。

从文档:

此实用程序在所有git存储库的根目录(可能是当前工作目录或 – 如果已设置 – GIT_DIR环境variables给出的目录)中进行recursionsearch,请按存储库path对此目录进行sorting,将chdir分为他们,并执行指定的git命令。

看起来像写脚本来做这件事很容易。 本质上,它需要迭代存储库,然后使用命令,如git ls-files,git diff和git log。

如果有人仍然在看这个线程,请检查我的shell脚本称为gitme

您将需要手动input您的本地git回购站,但我每天都使用这个工具来在多台计算机上合作多个git项目。

你可以运行git clone https://github.com/robbenz/gitme.git

脚本也张贴在下面

 #!/bin/bash -e REPOS=( /Users/you/gitrepo1 /Users/you/gitrepo2 /Users/you/gitrepo3 /Users/you/gitrepo4 ) MOVE="Moving to next REPO... \n" tput setaf 2;echo "What ya wanna do? You can say push, pull, commit, ftp push, or status"; tput sgr0 read input if [ $input = "commit" ] then tput setaf 2;echo "Do you want a unique commit message? [y/n]";tput sgr0 read ans if [ $ans = "y" ] then for i in "${REPOS[@]}" do cd "$i" tput setaf 6;pwd;tput sgr0 git add . -A read -p "Commit description: " desc git commit -m "$desc" tput setaf 2;echo $MOVE;tput sgr0 sleep 1 done else for i in "${REPOS[@]}" do cd "$i" tput setaf 6;pwd;tput sgr0 git add . -A git commit -m "autocommit backup point" tput setaf 2;echo $MOVE;tput sgr0 sleep 1 done fi elif [ $input = "push" ] || [ $input = "pull" ] || [ $input = "ftp push" ] || [ $input = "status" ] then for i in "${REPOS[@]}" do cd "$i" tput setaf 6;pwd;tput sgr0 git $input tput setaf 2;echo $MOVE;tput sgr0 sleep 1 done else tput setaf 1;echo "You have zero friends";tput sgr0 fi 

我在我的〜/ .bash_profile中设置了一个别名,所以alias gitme='sh /path/to/gitme.sh'

https://github.com/wwjamieson3/envisionTools有一个名为gitstat的bash脚本,可以做到这一点,还有更多。; 这是GNU和Mac兼容。 它可以执行提取从远程如果问。 它显示untracked,修改,添加,删除和分阶段的文件。 它与遥控器的区别在于显示了没有遥控器的提交和未完成的本地提交。 它也可以显示颜色编码的结果在摘要或详细模式,甚至HTML。 它使用定位,而不是查找,因为它是无限快,甚至会提示更新您的定位数据库,如果它太老了。