有没有办法在git status命令上调用脚本?

时间:2013-01-30 20:48:06

标签: git git-svn githooks git-status

我通过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命令时自动实现此目的?

我没有找到与此情况相关的任何钩子,因此我认为我需要找到解决此问题的方法。

2 个答案:

答案 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别名从存储库的根目录运行。其余部分与上面的函数解决方案相同。)