在 Git 中设置项目非常容易,因此我甚至可以为小脚本设置单独的存储库。现在的问题是如何管理它们。
我在多个地方使用这些存储库。当我对某些存储库进行更改时,我希望能够更新其他位置的存储库。
因此,我有一个包含许多存储库的目录。
- 如何获取所有存储库?
- 如何检查它们中是否有任何未提交的更改?
- 如何检查它们中是否有需要合并的更改?
最好能够用一个命令完成这些操作。
输出需要足够简洁,以便注意到需要处理的事项。
在 Git 中设置项目非常容易,因此我甚至可以为小脚本设置单独的存储库。现在的问题是如何管理它们。
我在多个地方使用这些存储库。当我对某些存储库进行更改时,我希望能够更新其他位置的存储库。
因此,我有一个包含许多存储库的目录。
最好能够用一个命令完成这些操作。
输出需要足够简洁,以便注意到需要处理的事项。
我强烈推荐使用多个存储库工具mr。我曾经像其他人一样使用自定义shell脚本,但对我来说,使用mr有以下好处:
关于你的问题:如何减少输出信息?可以使用命令行开关-q来修改详细程度。我喜欢默认输出,因为它将输出整合到一个简短而清晰的摘要中。
我使用以下别名来运行mr命令,以确保mr始终选择存储在$HOME中的默认项目列表,并使用5个并行线程:
alias mr='mr -d ~/ -j 5 '
我必须说,我一开始采用了目前被接受的答案(一个遍历存储库的帮助脚本集合),但总的来说,这对我来说是一次不够满意的体验。
所以,在尝试了mr、repo和git子模块之后,我发现它们各自存在不同的缺点,因此最终我做了自己的变体:http://fabioz.github.io/mu-repo,这是一个成熟的工具 -- 它具有以下工作流程:
请注意,它支持任何Python可运行的操作系统;)
mu sh <some command>
在多个仓库中执行一些任意命令,但它的最终目的是处理git而不是其他版本控制系统...如果你需要其他版本控制系统,那么请使用不同的工具。 - Fabio Zadrozny我写了一个命令行工具叫做gita,用于管理多个代码库。它可以将已注册的代码库状态并排显示,例如:
它还可以从任何工作目录委托git命令/别名。
现在使用这个工具来回答你的问题:
我如何获取所有这些?
gita fetch
gita ll
命令显示分支名称旁边的3个可能符号,表示:
+
: 暂存的更改*
: 未暂存的更改_
: 未跟踪的文件/文件夹pip3 install -U gita
Windows版本提供了一个上下文菜单来获取或拉取存储库。使用多选功能,您可以同时对多个存储库运行操作。
但是,您可能会发现另一个功能非常有用:
使用自动获取功能,您可以告诉RepoZ定期在后台获取所有git存储库的远程内容。当然,这些获取不会与您的本地提交发生冲突。与“git pull”不同,这里没有本地合并尝试。你可以尝试使用 repo 工具来管理存储库,通过自定义的 manifest.xml
文件指定它们的位置。关于如何使用此工具,请参阅 相关文档。
在 Android AOSP 项目 中,这是标准做法。
或者,您还可以使用 git-submodule(1)
。
manifest.xml
或与AOSP无关的任何内容似乎仍然不容易... - imbr#!/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 "$@" \;
}
.bash_aliases
文件中:alias rgit='function _rgit(){ find . -type d -name .git -printf "\n%p\n" -execdir git "$@" \;; }; _rgit'
。然后运行它,例如调用rgit status
。 - ford04gitslave是一个工具,可以通过创建超级项目/子项目之间的关系,在许多存储库上运行相同的命令。默认情况下,这提供了输出汇总,因此您可以集中精力处理提供唯一输出的存储库(对于git状态很有用,但对于git ls-files则不太有用)。
通常用于需要将几个存储库组装在一起并同时保持它们处于相同分支或标记的项目中。对于我的(裸)存储库目录,我只有一个小型的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
#!/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环境变量来覆盖此设置。
该脚本基于此脚本。
find . -name .git -print -execdir git pull \;
的作用就是你想象的那样。 - DawnSonggit-status-all
宝石来实现这一点: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
find . -name .git -print -execdir git status \;
是可以的。 - DawnSong
hg mercurial
回答。 - Serge Stroobandtgit for-each-repo
命令。 - VonCgit for-each-repo
循环中运行git rev-parse --git-dir
命令序列:这将显示每个存储库的根文件夹。 - VonC你可以运行 git for-each-repo --config=<config> -- xxx args
:这将在$PATH
中查找git-xxx
可执行文件,其中你可以放置任意数量的逗号。 - VonC