Gitフェッチまたはプルによる自動プルーン


248

作業が終わったために誰かがリモートブランチを削除し、それがわからない場合、私はgit fetch --prune削除せず、最終的には削除したブランチをプッシュバックします。

毎回指定する必要なしにフェッチ/プルするときにGitにプルーンモードを使用させるための実行可能なソリューションはありますか?


1
間もなく(git 1.8.5、Q4 2013)、常にプルーニングしたいリポジトリのローカル構成で指定できるようになりますgit fetch以下の私の回答を
VonC

回答:


395

git 1.8.5(2013年第4四半期)以降

" git fetch"(したがって " git pull"も) " fetch.prune"と " remote.*.prune"の構成変数を確認し、 " --prune"コマンドラインオプションが指定されているかのように動作することを学習しました。

つまり、remote.origin.pruneをtrueに設定した場合、

git config remote.origin.prune true

任意git fetchまたはgit pull自動的にプルーニングします。

注:Git 2.12(2017年第1四半期)は、この構成に関連するバグを修正しますgit remote rename
gitリモートの名前を変更するにはどうすればよいですか?参照してください。


コミット737c5a9で詳細を参照してください。

git fetch --prune」がないと、反対側がすでに削除したブランチのリモート追跡ブランチは永久に残ります。
常に " git fetch --prune"を実行したい人もいます。

常にプルーニングするか、特定のリモートからフェッチする場合に対応するユーザーに対応するには、2つの新しい構成変数「fetch.prune」と「remote.<name>.prune」を追加します。

  • " fetch.prune"は、すべてのフェッチ操作でプルーンを有効にすることができます。
  • remote.<name>.prune」では、リモートごとに動作を変更できます。

後者は当然前者をオーバーライド--[no-]pruneし、コマンドラインからのオプションは構成されたデフォルトをオーバーライドします。

--pruneは破壊的な操作になる可能性があるため(Gitは削除された参照のreflogをまだ保持していません)、ユーザーの同意なしにプルーニングしたくないため、この構成はデフォルトではオンになりません。


4
これは確かに、現在リリースされているgit 1.8.5
Bessey

1
私はすべてのgitリポジトリでデフォルトでこの動作が必要です。これを私の.gitconfigに入れてそれを実現できる場所はありますか?
Andrew

47
@Andrewの良いスタートはgit config --global fetch.prune true
VonC

1
常にプルで剪定することの可能な欠点は何ですか?引用は、reflog履歴が影響を受けると述べています...
Grapho

3
@Graphoには本当のマイナス面はありませんが... stackoverflow.com/a/39862779/6309で
VonC

142

git config --global fetch.prune true

すべてのGitリポジトリで常に使用--pruneするgit fetchgit pullは:

git config --global fetch.prune true

この上記のコマンドは、グローバルGit構成(通常は~/.gitconfig)に次の行を追加します。git config -e --globalグローバル構成を表示するために使用します。

[fetch]
    prune = true

git config remote.origin.prune true

常に--prune1つのリポジトリからのみ:

git config remote.origin.prune true
                 #^^^^^^
                 #replace with your repo name

この上のコマンドは、ローカルGit構成(通常は.git/config)の下の最後の行を追加します。git config -eローカル構成を表示するために使用します。

[remote "origin"]
    url = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    fetch = +refs/heads/*:refs/remotes/origin/*
    prune = true

--global2番目のコマンド内で使用することも--local、最初のコマンド内で使用することもできます。


git config --global gui.pruneDuringFetch true

使用git guiする場合は、次の方法でも興味があります。

git config --global gui.pruneDuringFetch true

追加します:

[gui]
    pruneDuringFetch = true

参考文献

からの対応するドキュメントgit help config

--global

  書き込みオプションの場合:~/.gitconfigリポジトリ.git/configではなくグローバルファイルに書き込み$XDG_CONFIG_HOME/git/config、このファイルが存在し、~/.gitconfigファイルが存在しない場合はファイルに書き込みます。

 

--local

  書き込みオプションの場合:リポジトリ.git/configファイルに書き込みます。これがデフォルトの動作です。

 

fetch.prune

  trueの場合、fetchは--pruneコマンドラインでオプションが指定されたかのように自動的に動作します。もご覧くださいremote.<name>.prune

 

gui.pruneDuringFetch

フェッチの実行時にgit-guiがリモート追跡ブランチをプルーニングする  場合は「true」。デフォルト値は「false」です。

 

remote.<name>.prune

  trueに設定した場合、デフォルトでこのリモートからフェッチすると、リモートに存在しなくなったリモートトラッキング参照も削除されます(--pruneコマンドラインでオプションが指定された場合と同様)。fetch.pruneもしあれば、設定を上書きします。


1
補足:この投稿についてgit config -egit config -e --globalまたこの投稿から学んだところです。vimgit configファイルへの特定のパスを指すコマンドを入力する必要がなくなり、その特定のパスが何であるかを考える必要がなくなりました。
ecbrodie

1
これがあなたが取り組むことができる答えです。どうもありがとうございました。
sebingel

この答えは非常に完全ですが、そのフォーマットのために読むのは非常に困難です。私は「すべてのGitリポジトリでgit fetchとgit pullを常に--pruneするために」を見つけましたgit config --global fetch.prune true(関連ドキュメントへのリンク付き)。
Thibaud Colas

19

いつでも使いたいprune場合はfetchエイリアスを使用することをお勧めします。

入力git config -eしてエディターを開き、特定のプロジェクトの構成を変更して、次のようなセクションを追加します

[alias]
pfetch = fetch --prune   

git pfetchプルーンでフェッチするときは自動的に行われます。


わかります。ちなみに、pullはgit pfetchではなくgit fetchを使用します... pullのエイリアスを直接指定する必要がありますか?
Edmondo1984 2013

1
します。この方法では、通常のオプションが、両方持っているpullfetch、その剪定バージョンを。実際、私は(まだ試していませんが)fetch = fetch --pruneエイリアスセクションに直接書き込むことができるpullため、プルーニングされたフェッチを自動的に使用すると
思い

2
私の知る限り、fetch = fetch --prune動作しませんが、エイリアスでコマンドを上書きしても動作しませんでした。私は古いバージョン(1.7.2.5)を使用していますので、これは可能性があり
Uipko

3
git configのドキュメントから:「スクリプトの使用に関する混乱とトラブルを回避するために、既存のGitコマンドを非表示にするエイリアスは無視されます。」
Dewayne Christensen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.