2017-01-11 2 views
2

は次のように質問(例えばthis oneまたはthis one)がたくさんありますが、受け入れられた答えは、私の正確な質問に答えるようには見えません。削除されたアップストリームを持つローカルブランチを削除するにはGitコマンドを使用しますか?

支社は、マスタにマージされていません。マシンAとマシンBの両方が同じリモートを指しています。そのリモートにBranch1が存在します。マシンAで

私はローカルに支社を削除し、支社やリモコン/起源/支社はマシンAから削除され、支社がリモートから削除されるように、リモートに削除を押してください。マシンBIで

は場合git fetch --pruneがマシンB上の私のローカルリポジトリからリモコン/起源/支社を取り除くこと

  • git checkout Branch1、その後
  • git checkout Branch2、その後
  • git fetch --prune

を実行しますその後、実行してBranch1に戻ります。git checkout Branch1エラーメッセージが表示されます。

は「支社」
あなたのブランチ「が起源/支社」に基づいているブランチにスイッチが、上流がなくなっています。
(フィックスアップに「gitのブランチ--unset上流」を使用)

は、上流削除したローカル枝を除去するためのgitのコマンドはありますか?

+2

私は信じられません。手動でそれらを削除する必要があります。 – Whymarrh

答えて

1

Whymarrh's comment:これを行うための組み込みコマンドはありません。

はそのようなビルトイン、同様に存在しない正当な理由があります。上流のリモートトラッキングブランチが整理されているからといって、必ず自分のの作業を取り除く準備ができているわけではありません。あなたは一つの良いがBranch1にコミット作り、それをgit pushする準備ができていたが、先週中断してしまった

...--o--o--o  <-- origin/Branch1 
      \ 
      o <-- Branch1 

:あなたの例では、git fetch --pruneorigin/Branch1を削除し、おそらく前に、もしかしたら、コミットグラフ画像は、このように見えました。今origin/Branch1がなくなっていることを、おそらくあなたは良いどこかにコミットコピーしたいと思います。origin/Branch1がなくなっている。しかし今では、グラフにキンクを維持する理由はありません、とGitは見ることができるすべてはこれです:

...--o--o--o--o <-- Branch1 

それはあなたのBranch1が上流に構成したことを知っているが、それがコミットしている知っていません上流に設定されたものは、存在していた時点を指していました。あなたは、このような枝を削除したいかなり一定している場合、あなたは短いスクリプトからそれを行うことができますそれにもかかわらず

、:

#! /bin/sh 
# 
# rm-if-gone: remove branches that have a configured upstream 
# where the configured upstream no longer exists. Run with 
# -f to make it work, otherwise it just prints what it would 
# remove. 
force=false 
case "$1" in 
-f) force=true;; 
esac 

for branch in $(git for-each-ref --format='%(refname:short)' refs/heads); do 
    # find configured upstream, if any 
    remote=$(git config --get branch.$branch.remote) || continue 
    # if tracking local branch, skip 
    if [ "$remote" = . ]; then continue; fi 
    # if the upstream commit resolves, skip 
    ucommit=$(git rev-parse "${branch}@{u}" 2>/dev/null) && continue 
    # upstream is invalid - remove local branch, or print removal 
    $force && git branch -D $branch || echo "git branch -D $branch" 
done 

(上記はテストされていない。また、それはない、あなたができるので、 現在のブランチを削除してください。削除しないブランチにいることを確認する必要があります)。

0

git remote prune origin --dry-run

実際にプルーンを実行するために--dry-runを削除します。 docsから:

nameの下にあるすべての古いリモート追跡ブランチを削除します。これらの古い ブランチはすでにnameが参照するリモートリポジトリ から削除されて、それでも 「リモコン/ name」でローカルに用意されていています。

+0

'remotes/origin/Branch1'ブランチは 'git fetch --prune'によって既に削除されています。あなたが提案するコマンドはまったく何もしなかったが、ローカルブランチ 'Branch1'は依然としてブランチリストにある。 – dumbledad

関連する問題