我通过git-svn工具管理我的svn存储库作为git repo,但是没有办法处理我的svn外部。通过将每个外部视为git-svn repo来解决该问题。这是使用脚本完成的,结果类似于:
> src/
> -- .git/
> -- Source1.x
> -- Source2.x
> -- .git_external/
> ---- git-svn_external1/
> ------ .git/
> ------ ExternalSource1.x
> ---- git-svn_external2/
> ------ .git/
> ------ AnotherExternalSource1.x
> ------ AnotherExternalSource2.x
由于缺少处理svn外部的工具,我需要通过手动执行的bash脚本验证每个修改,它是这样的:
#!/bin/sh
for i in `ls .` do
if [ -d $i ] then
cd $i
if [ -d .git ] then
git status .
fi
cd ..
fi
done
如何在主git-svn存储库上执行git status
命令时自动实现此目的?
我没有找到与此情况相关的任何钩子,因此我认为我需要找到解决此问题的方法。
答案 0 :(得分:4)
一般来说,git尝试提供尽可能少的钩子,只在不能使用脚本的情况下提供它们。在这种情况下,只需编写一个执行出价并运行git status
的脚本。运行此脚本而不是git status
。
如果您将其称为git-st
并将其放入PATH,则可以通过git st
进行调用。
答案 1 :(得分:3)
我曾经使用过几次的技巧是围绕git
编写一个shell包装函数。假设您正在使用Bash(它与其他shell类似),请将以下内容添加到~/.bashrc
:
git () {
if [[ $1 == status ]]
then
# User has run git status.
#
# Run git status for this folder. The "command" part means we actually
# call git, not this function again.
command git status .
# And now do the same for every subfolder that contains a .git
# directory.
#
# Use find for the loop so we don't need to worry about people doing
# silly things like putting spaces in directory names (which we would
# need to worry about with things like `for i in $(ls)`). This also
# makes it easier to recurse into all subdirectories, not just the
# immediate ones.
#
# Note also that find doesn't run inside this shell environment, so we
# don't need to worry about prepending "command".
find * -type d -name .git -execdir git status . \;
else
# Not git status. Just run the command as provided.
command git "$@"
fi
}
现在,当您运行git status
时,它实际上会为当前文件夹以及包含其自己的git status
文件夹的任何子文件夹运行.git
。
或者,您可以将此命名为新命令,方法是将脚本编写为Chronial suggests,或者将其放入Git别名中。要执行后者,请执行以下命令:
git config --global alias.full-status '!cd ${GIT_PREFIX:-.}; git status .; find * -type d -name .git -execdir git status . \;'
然后你就可以运行git full-status
来做同样的事情了。
(cd ${GIT_PREFIX:-.}
部分用于返回您运行命令的目录;默认情况下,Git别名从存储库的根目录运行。其余部分与上面的函数解决方案相同。)