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-stPATH に入れると、 経由で呼び出すことができますgit st

于 2013-01-30T21:19:01.367 に答える
3

私が何度か使用したトリックは、シェル ラッパー関数を .xml の周りに記述することgitです。Bash を使用していると仮定して (他のシェルでも同様です)、以下を に追加します~/.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 に答える