管理许多git存储库

iny*_*iny 72 git multiple-repositories

在git中设置项目很简单,所以即使是小脚本我也可以拥有单独的存储库.现在的问题是如何管理它们.

我使用这些存储库在多个地方工作.当我对某个存储库进行了更改后,我希望能够在其他位置更新存储库.

所以我有一个包含许多存储库的目录.

  1. 我怎样才能取出所有这些?
  2. 如何检查是否有任何未提交的更改?
  3. 如何检查是否有任何更改要合并?

能够用一个命令完成这些操作会很高兴.

输出需要足够沉默才能真正注意到要做的事情.

小智 42

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

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

关于静默输出的问题:可以使用命令行开关-q修改详细程度.我更喜欢默认输出,它看起来很简单,在简短的摘要中统一输出.

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

alias mr='mr -d ~/ -j 5 '
Run Code Online (Sandbox Code Playgroud)

  • 它支持Windows吗? (5认同)
  • @HugoZaragoza,你总是可以自己定义这个命令 [DEFAULT] tag = git tag "$@" (2认同)
  • `别名 pa='find 。-name .git -print -execdir git pull \;'` 那么,`pa` 就够了 (2认同)

Fab*_*zny 17

我必须说我从目前接受的答案开始(只是一堆辅助程序脚本迭代存储库),但总而言之,这对我来说是一种缺乏经验.

所以,在尝试先生,回购和git-submodules后,我发现每个都缺少不同的方式,所以,我最终做了我自己的变体:http://fabioz.github.io/mu-repo这是一个成熟的工具这一点 - 它有工作流程,允许您:

  • 克隆多个回购
  • diff(和编辑)多个repos中的当前更改
  • 预览传入的更改
  • 并行运行多个repos中的命令
  • 创建回购组
  • 在多个repos上运行与git相关的命令
  • 等(请参阅主页了解更多信息).

请注意,它支持Python运行的任何操作系统;)

  • 呃,它的目的实际上是只支持 git 存储库(这就是问题所问的)——尽管你也可以执行 `mu sh <some command>` 在多个存储库中执行某些任意命令,但它的全部最终结果是处理 git而不是其他版本控制系统......如果您需要它,那么是的,请使用不同的工具。 (3认同)

Mem*_*ing 13

gr(git-run)扩展了 mr的功能(仅适用于git).我发现使用其标签系统组织多个git repos更容易.但代码gr并没有得到很好的维护.如果您使用的是bash,请确保使用它-t tag而不是#tag表单.


Spo*_*ike 7

您可以尝试使用带有自定义文件的repomanifest.xml来指定存储库的位置.有一些文档说明如何执行此操作.

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

  • 如果我想将存储库保持在完全相同的状态,那么git-submodule会很好,但是事实并非如此。每个地方的存储库集都不相同。可能有未提交的更改。可能有一些我不想合并的更改。 (2认同)

Wae*_*her 6

我编写了一个名为“ RepoZ ”的工具,它会在您克隆它们或更改其中的任何内容(例如切换分支)时自动发现 git 存储库。

一旦找到,存储库就会被“跟踪”。这将简单地将它们显示在本地存储库列表中,包括受posh-git启发的密集状态信息。这包含当前分支和其他内容,例如文件编辑和传入或传出提交的计数。

回购用户界面

这有助于跟踪您的本地存储库以及要提交或推送的未完成工作。此外,您可以使用存储库列表作为从一个存储库切换到另一个存储库的导航。

回购导航

“我怎样才能把它们都拿来?”

Windows 版本提供了一个上下文菜单来获取或拉取存储库。通过多选,您可以一次在多个存储库上运行操作。

但是,您可能会发现另一个非常有用的功能:

RepoZ 自动获取

使用自动获取,您可以告诉 RepoZ 在后台定期获取所有 git 存储库的遥控器。当然,这些提取不会与您的本地提交发生冲突。没有像 with 那样的本地合并尝试git pull


nos*_*nos 6

我编写了一个名为gita的命令行工具来管理多个存储库。它并排显示已注册回购的状态,例如

在此处输入图片说明

它还可以从任何工作目录委派 git 命令/别名。

现在使用此工具回答您的问题:

我怎样才能获取所有这些?

gita fetch
Run Code Online (Sandbox Code Playgroud)

如何检查其中是否有任何未提交的更改?

gita ll命令在分支名称旁边显示 3 个可能的符号,表示

  • +: 阶段性变化
  • *: 未分阶段的变化
  • _:未跟踪的文件/文件夹

如何检查它们中的任何一个是否有要合并的更改?

分支名称以 5 种方式着色

  • 白色:本地分支没有远程分支
  • 绿色:本地分支与远程分支相同
  • 红色:本地分支与远程分支有分歧
  • 紫色:本地分支领先于远程分支(适合推送)
  • 黄色:本地分支在远程分支后面(适合合并)

要安装它,只需运行

pip3 install -U gita
Run Code Online (Sandbox Code Playgroud)


Sco*_*tts 5

我使用此脚本轻松地在我的所有存储库中执行 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
Run Code Online (Sandbox Code Playgroud)

默认情况下,脚本将在 ~/cm/src 中查找 git 存储库,但您可以通过根据自己的喜好设置 GITREPO 环境变量来覆盖它。

这个脚本就是基于这个脚本


Set*_*son 5

gitslave是一个工具,可以通过在超级库和子库之间创建超级项目/子项目关系来在许多存储库上运行相同的命令。这个(默认情况下)提供输出摘要,因此您可以专注于提供唯一输出的存储库(对于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
Run Code Online (Sandbox Code Playgroud)


Nat*_*han 5

您可以使用git-status-allgem 来实现此目的: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
Run Code Online (Sandbox Code Playgroud)

还有一个获取选项,可以在显示状​​态之前从所有存储库的源中获取:

git status-all --fetch
Run Code Online (Sandbox Code Playgroud)

git 状态全部


jam*_*ing 5

I've made an alias and a function to run any git command on all repositories available in a directory (recursively). You can find it here: https://github.com/jaguililla/dotfiles/git

This is the code:

#!/bin/sh
# To use it: source git_aliases

# Example: rgita remote \;
alias rgita='find . -type d -name .git -execdir git'

# Example: rgit remote -vv
rgit() {
  rgita "$@" \;
}
Run Code Online (Sandbox Code Playgroud)

Hope it helps :)