2

我通过 git-svn 工具将我的 svn 存储库作为 git 存储库进行管理,但是没有办法处理我的 svn 外部。通过将每个外部视为 git-svn 存储库来解决此问题。这是使用脚本完成的,结果类似于:

> 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 status在主 git-svn 存储库上执行命令时如何自动实现这一点?

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

4

2 回答 2

4

一般来说,git 会尝试提供尽可能少的钩子,仅在您无法使用脚本的情况下提供它们。在这种情况下,只需编写一个执行您的竞标并运行的脚本git status。运行此脚本而不是git status.

如果你调用它git-st并将它放在你的 PATH 中,你可以通过git st.

于 2013-01-30T21:19:01.367 回答
3

我使用过几次的一个技巧是围绕git. 假设您使用的是 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 建议的方式编写脚本或将其放入 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 别名默认从存储库的根目录运行。其余的与上面的函数解决方案相同。)

于 2013-01-30T22:18:21.797 回答