15

3 つの別々のフォルダーに 3 つのブランチを保持する必要があります。(これが git のやり方ではないことはわかっています。しかし、これを行う必要があるのには理由があります)。

レポ名が であるとしましょう。ローカル システムに次my_proj_repo.git のフォルダーを作成しました。prodv1

git clone url:/my_proj_repo.git

今、私はprodv1フォルダに入り、サーバーからファイルをコピーしました:

git commit -am "initial import"
git push origin master

これにより、ファイルがマスターにプッシュされました。ここで、ローカル システムに上記のようなフォルダーをさらに 2 つ作成しました。

stagingv1
devv1

次の名前のローカル ブランチとリモート ブランチを 2 つ作成します。

staging // this local branch points (push/pull) to staging remote branch
dev     // this local branch points ((push/pull) to dev remote branch

これら 2 つのブランチは、対応するフォルダーにある必要があります。

staging ==> stagingv1 folder
dev     ==> devv1 folder

私はいくつかのことを試しましたが、私はそれを台無しにしたと思います。誰かが私が望むようにこのセットアップをすべて取得するためのコマンド/手順を教えてもらえますか?

私がしたことは、stagingv1フォルダに入ってgit clone <repo>. しかし、デフォルトではmaster. stagingここでブランチを初期化する方法がわかりません。

4

4 に答える 4

19

git 2.5 でgit worktreeコマンドが導入されて以来、達成したいことはより単純になりました (または些細なことでさえあります) 。

基本的に、あなたの git リポジトリには、作業ツリーと呼ばれるチェックアウトされたブランチの数が完全に解放されています。

  • 0 (裸のレポ - おおよそレポの .git ディレクトリの内容のみ)
  • 1 (通常のレポ - ツリー内のコード、下の git ディレクトリ.git)
  • n > 1、n-1 個のワークツリーを追加した通常のレポ(レポ外の任意のパスで、.gitレポの git ディレクトリを指すファイルを使用)

リポジトリにすでにブランチが含まれている場合は、次のことができます。

git worktree add <path to branch> <branch name>

または、そのブランチがまだ作成されておらず、master からブランチしたい場合:

git worktree add -b <new branch name> <path to branch> master

複数のディレクトリにあるブランチを同時にチェックアウトできないことに注意してください。

于 2016-08-05T17:47:19.420 に答える
1

すべてのリモート ブランチを個別のワークツリーにチェックアウトし、同期を維持する bash スクリプトを次に示します。実行するたびに、ローカルの変更は破棄されます。チェックアウトされたコードがリポジトリをミラーリングしようとするだけです。

git fetch --all --prune

# reset branch only if it has deviated from the remote
function update_branch {
        if git diff --exit-code --quiet $1; then
                echo "No changes on branch $1"
        else
                echo "Resetting branch $1"
                git reset --hard $1
        fi
}

# master branch is checked out in the root
update_branch origin/master

# check out each remote branch into a subfolder
branches=$(git for-each-ref --format='%(refname:short)' refs/remotes/origin | grep -v /HEAD | grep -v /master)
for branch in $branches; do
        if [ -d $branch ]; then
                cd $branch
                update_branch $branch
                cd $OLDPWD
        else
                echo "Checking out new branch $branch"
                git worktree add $branch $branch
        fi
done

# check for branches that have been deleted on the remote
for branch in origin/*; do
        if ! git show-ref --verify refs/remotes/$branch --quiet; then
                echo "Removing worktree $branch"
                git worktree remove $branch
        fi
done

git worktree prune

于 2020-11-26T11:15:27.113 に答える