2

多数の中央gitリポジトリがあり、ブランチを使用してさまざまなプロジェクトの作業を追跡しています。プロジェクトが終了すると、マスターにマージしてオリジンにプッシュします。

新しいプロジェクトを開始するとき、開発者へのヘッドアップとして(たとえば、リリース計画を伝えることができるように)、そのリポジトリにある他の現在の作業をリストしたいと思います。git branch --all --no-merged origin/master有望に見えますが、どうやらそれはコミットを持っているブランチだけをリストしています。概念的には、新しく作成された「空の」ブランチでさえ、何らかの作業を行う意図を示しているので、これらもリストする必要がありますか?

これは、ブランチとブランチヘッドの違いに関係しているのではないかと思います。ブランチヘッドはその始点を指していますが、マージするものは何もありません。しかし、マージは履歴に明示的に記録されているので(右?)、「空の」ブランチでさえマージされていないものとして識別できるのではないでしょうか。これはできますか?

明らかな回避策は、新しいブランチごとにダミーの初期コミットを強制することですが、可能であればこれを避けたいと思います。また、開発者が望まない場合は、未完成の変更をプッシュする必要はないようです(したがって、プロジェクトが完了するまで、中央リポジトリのほとんどのブランチは空のままになると思います)。

例:

# Alice creates and pushes branch1
git clone $REPO clone1
git checkout -b branch1
git push -u --all
# ...continues development in her local repository...

# Bob wants to know if anybody is working on $REPO
git clone $REPO clone2
git branch --all --no-merged origin/master
# no output - he doesn't realize Alice is working in the same repository
4

3 に答える 3

1

私が欲しいものに対するgit組み込みのサポートはないようですが、いくつかのgit配管を使用すると、Gitで分岐点を見つけることに触発されて、探していた結果が得られましたか?

これらの仮定が正しくない場合はお知らせください...

  • ヘッドがからのブランチポイントと一致するorigin/master(つまり、コミットがない)ブランチは、作業を行う意図を示す空のブランチである必要があります。
  • 最適なマージポイントがそのヘッドと一致するブランチorigin/masterは、すでに完全にマージされており、無視できます。
  • その他の場合は、変更がマージされていないブランチである必要があります。

すべてのリモートブランチのカテゴリを出力するスクリプトの例。ボブがこれを実行した場合、それは彼に伝えますrefs/remotes/origin/branch1: new branch without any commits

#! /usr/bin/env bash

# check branches created from and merged to this branch
MASTER=refs/remotes/origin/master

# for each remote branch...
for BRANCH in $(git for-each-ref --format='%(refname)' refs/remotes/); do
    # ...except the $MASTER branch and the current HEAD
    [[ $BRANCH == $MASTER || $BRANCH =~ /HEAD$ ]] && continue

    # get the hash for the head of the branch
    BRANCH_HEAD=$(git show-ref --head --hash $BRANCH)

    # returns the first shared commit among $MASTER and $BRANCH commits
    BRANCH_POINT=$(fgrep -m 1 -f <(git rev-list --first-parent $BRANCH) \
                                 <(git rev-list --first-parent $MASTER))

    # find the best merge point
    BRANCH_MERGE=$(git merge-base $MASTER $BRANCH)

    # determine the type of branch
    if [[ $BRANCH_POINT == $BRANCH_HEAD ]]; then
        echo "$BRANCH: new branch without any commits"
    elif [[ $BRANCH_MERGE == $BRANCH_HEAD ]]; then
        echo "$BRANCH: fully merged into $MASTER"
    else
        echo "$BRANCH: branch with unmerged changes"
    fi
done
于 2012-11-27T14:40:33.417 に答える
0

いいえ、branch1にはマージされていない変更がないためです。したがって、「-no-merged」はブランチをリストしません。アリスが変更をコミットしてプッシュすると、それが表示されます。

于 2012-11-19T23:23:57.543 に答える
0

私はこれについてDoug-Wと一緒にいるのではないかと心配しています。--no-merged現在のブランチに含まれていないコミット(または多数)を含むブランチを指します。マスターからブランチしているので、フォローアップコミットを行わないよりも、ブランチに含まれるすべてのコミットもマスター内にあります。

ブランチの作成には、ブランチがいつ作成されたかという概念がないため、将来、あなたとあなたの会社にとって重要になる可能性のあるメトリックを失うことになります。単純な「スタブ」ファイルだけでブランチが作成された後、1つのコミットだけを行う場合は、このスタブコミットのタイムスタンプと2番目のコミットのタイムスタンプを使用して、プロジェクトが開始する前にパークされた期間を知ることができます。

これには、コマンドでこれらのブランチを報告するという追加の利点もあります--no-merged

于 2014-11-14T08:12:06.483 に答える