iny*_*iny 72 git multiple-repositories
在git中设置项目很简单,所以即使是小脚本我也可以拥有单独的存储库.现在的问题是如何管理它们.
我使用这些存储库在多个地方工作.当我对某个存储库进行了更改后,我希望能够在其他位置更新存储库.
所以我有一个包含许多存储库的目录.
能够用一个命令完成这些操作会很高兴.
输出需要足够沉默才能真正注意到要做的事情.
小智 42
我强烈推荐多个存储库工具先生.我曾经使用其他人推荐的自定义shell脚本一段时间,但使用mr对我有以下好处:
关于静默输出的问题:可以使用命令行开关-q修改详细程度.我更喜欢默认输出,它看起来很简单,在简短的摘要中统一输出.
我使用mr命令的以下别名来确保mr始终获取存储在$ HOME中的默认项目列表,并使用5个并行线程:
alias mr='mr -d ~/ -j 5 '
Run Code Online (Sandbox Code Playgroud)
Fab*_*zny 17
我必须说我从目前接受的答案开始(只是一堆辅助程序脚本迭代存储库),但总而言之,这对我来说是一种缺乏经验.
所以,在尝试先生,回购和git-submodules后,我发现每个都缺少不同的方式,所以,我最终做了我自己的变体:http://fabioz.github.io/mu-repo这是一个成熟的工具这一点 - 它有工作流程,允许您:
请注意,它支持Python运行的任何操作系统;)
您可以尝试使用带有自定义文件的repomanifest.xml来指定存储库的位置.有一些文档说明如何执行此操作.
或者你可以使用git-submodule(1).
我编写了一个名为“ RepoZ ”的工具,它会在您克隆它们或更改其中的任何内容(例如切换分支)时自动发现 git 存储库。
一旦找到,存储库就会被“跟踪”。这将简单地将它们显示在本地存储库列表中,包括受posh-git启发的密集状态信息。这包含当前分支和其他内容,例如文件编辑和传入或传出提交的计数。
这有助于跟踪您的本地存储库以及要提交或推送的未完成工作。此外,您可以使用存储库列表作为从一个存储库切换到另一个存储库的导航。
Windows 版本提供了一个上下文菜单来获取或拉取存储库。通过多选,您可以一次在多个存储库上运行操作。
但是,您可能会发现另一个非常有用的功能:
使用自动获取,您可以告诉 RepoZ 在后台定期获取所有 git 存储库的遥控器。当然,这些提取不会与您的本地提交发生冲突。没有像 with 那样的本地合并尝试git pull。
我编写了一个名为gita的命令行工具来管理多个存储库。它并排显示已注册回购的状态,例如
它还可以从任何工作目录委派 git 命令/别名。
现在使用此工具回答您的问题:
我怎样才能获取所有这些?
gita fetch
Run Code Online (Sandbox Code Playgroud)
如何检查其中是否有任何未提交的更改?
该gita ll命令在分支名称旁边显示 3 个可能的符号,表示
+: 阶段性变化*: 未分阶段的变化_:未跟踪的文件/文件夹如何检查它们中的任何一个是否有要合并的更改?
分支名称以 5 种方式着色
要安装它,只需运行
pip3 install -U gita
Run Code Online (Sandbox Code Playgroud)
我使用此脚本轻松地在我的所有存储库中执行 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 环境变量来覆盖它。
这个脚本就是基于这个脚本。
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)
您可以使用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)
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 :)