デフォルトで--force-with-leaseをプッシュ


130

たった今学んだgit push --force-with-lease。それはかなり素晴らしいです。しかし、もちろん、私はそれほど頻繁に力を使用しないので、次回この機能が必要になったときに、この気の利いた機能を忘れてしまうのではないかと心配しています。

私が意図的にそれを上書きしない限り、git push -f自動的に使用するようにgitを構成する方法はあり--force-with-leaseます--no-force-with-leaseか?

(リースなしで武力を行使したいとは思いもしません!)

回答:


141

私の知る限りでは、force-with-lease代わりにgitを常に使用するようにgitに指示できる設定はありませんforce。これは機能リクエストの良い例のようです。gitコードベースに飛び込むのに問題がない場合は、自分で実装してレビューのために送信できます。

編集現状では、これは2019年4月にも当てはまります。

それまで私が目にする唯一の選択肢は、いつものように、aliasこの目的に役立つを作成することです。

エイリアスを作成する

エイリアスを作成するには、を使用git config --global alias.<alias-name> <command>します。この場合、私はこれに似たものを提案します。

git config --global alias.pushf "push --force-with-lease"

これにより、グローバル.gitconfigファイルにエントリが作成されます(通常、ホームディレクトリにあります)。この後、あなたは簡単に使用できるgit pushfために強制的にリース

手を汚す

自分で機能を実装したいが、どこから始めればよいかわからない場合は、最初にgitリポジトリのドキュメントディレクトリを確認する必要があります。ここでは、コーディングのガイドラインパッチの提出方法に関する情報を見つけることができます

これらのリンクなどはすべて公式コミュニティページで確認できます


25
これが機能ではないことに注意してください。標準コマンドの書き直し( "push --force")に対する一般的な議論は、慣れ、その起源を忘れ、ある日、新しいシステムで誤ってそのように使用することです。.bashrcのエイリアスのrmようrm -iに。いつかサーバー上の重要なファイルを忘れて削除してしまいます。独自のエイリアスを使用しても問題はありません:)
hraban

2
個人的な逸話/注意事項:エイリアスにしてみましたpushfpush -f、エイリアスに似ているため、を実行していないことを常にダブルチェックしました。push -fとにかく、一部のチームメンバーは、エイリアスを単にその表面的な省略形だと考えて使用していました。最終的には、pushfl代わりに安全なフォームのエイリアスを作成し、その心配をしなくなりました。
ケルビン

31

この気の利いた機能が次回必要になったときに忘れてしまうのではないかと心配しています。

このプッシュオプションに対しては、「保護」は、あなたがしてもいるので、忘れされていない理由のGit 2.13(Q2 2017)が説明していないで、それを忘れgit pushレベル、それはまだ無視される可能性があります。

参照してくださいf17d642コミットにより(2017年4月19日)をÆvarアインホルトBjarmason( )avar
(合併によりJunio C浜野- gitster-46bdfa3コミット、2017年4月26日)を

push--force-with-lease複数のリモートを使用したドキュメント化とテスト

2つのgit push --force-with-leaseリモートが同じURLを指している場合のドキュメント化とテストを行い、バックグラウンドでのフェッチとその後のフェッチで、フェッチしていない未更新の参照を壊さないようにする必要があります。

MicrosoftのVSCなどの一部のエディターには、バックグラウンドで自動フェッチする機能があります。これにより--force-with-lease--force-with-lease=<refname>、ここに追加されるドキュメントに記載されているように、によって提供される保護がバイパスされます。

したがって、今のドキュメントにgit pushは次のものが含まれます。

安全性に関する一般的な注意事項:としてすなわち、期待値なしでこのオプションを供給--force-with-leaseまたは--force-with-lease=<refname> 暗黙的に実行されることを何でも非常にひどく相互作用git fetchなど、バックグラウンドでにプッシュされるように、リモートでgit fetch origin cronジョブでリポジトリに。

それが提供する保護--forceは、あなたの作業が基づいていないその後の変更が破壊されないことを保証することですが、これは、バックグラウンドプロセスがバックグラウンドでrefを更新している場合、自明です。私たちは、あなたが見たはずであり、そしてより大胆にしようとするであろう参照のヒューリスティックとして、リモート追跡情報以外に何も持っていません。

エディターまたは他のシステムがgit fetchバックグラウンドで実行されている場合、これを軽減する方法は、単に別のリモートをセットアップすることです。

git remote add origin-push $(git config remote.origin.url)
git fetch origin-push

これで、バックグラウンドプロセスが実行されるgit fetch originときに参照origin-pushが更新されないため、次のようなコマンドが実行されます。

git push --force-with-lease origin-push

手動で実行しないと失敗しますgit fetch origin-push
このメソッドはもちろんgit fetch --all、を実行するものによって完全に無効にされます。その場合は、このメソッドを無効にするか、次のような面倒なことを行う必要があります。

git fetch              # update 'master' from remote
git tag base master    # mark our base point
git rebase -i master   # rewrite some commits
git push --force-with-lease=master:base master:master

baseつまり、これまでに確認して上書きしたいアップストリームコードのバージョンのタグを作成し、履歴を再書き込みmasterbase、ローカルでのremotes/origin/master更新内容に関係なく、リモートバージョンがである場合は最後にプッシュ変更を強制します。バックグラウンド。


30

私の解決策は、ラッパースクリプトを作成し、エイリアスを使用して、常に実際のの代わりに使用することでしたgit

しようとするgit push -fと、次のようになります。

⚡ git push -f
use this instead so you don't cause race conditions in the 
repo: git push --force-with-lease

このスクリプトのいくつかの利点は次のとおりです。

  • それは私が常用するように訓練する--force-with-leaseので、私がそれを間違えたときに私はしつこくなりません
  • 何らかの理由で、実際にプッシュを強制する必要がある場合git push --forceは、機能します。

それを実装する方法:

  1. を除くすべてのパラメーターをgitに渡すカスタムスクリプトを作成します。 -f
  2. そのスクリプトにエイリアスを付けるので、代わりに使用します git

これらの手順は、bashを実行しているLinuxまたはMacを想定しています。私はこれをzshやWindowsで試していませんが、そこでも動作すると思います。

~/.bash_profile

alias git=~/.git_wrapper.sh

~./git_wrapper.sh

#!/bin/bash
for arg in "$@"; do
    if [ "$arg" = "push" ]; then
        ispush=1
    elif [ "$ispush" = 1 -a "$arg" = '-f' ]; then
        echo "use this instead so you don't cause race conflicts in the repo: git push --force-with-lease"
        exit 1
    fi
done

git "$@"

これらの変更を加えて、ターミナルを再起動すると、gitプッシュを強制しようとしたときに気が利くはずです。


17
それは便利なようです。+1。たぶん、「ちょっとバカ」を「ちょっと、優しくてシンプルな魂」に置き換えるか、そのようなものに変えるかもしれません;)
VonC '29 / 11/17


3

私が使用してはならないことを思い出すことにしたい-fが、私はその信じるようにだまされたくない-f手段を--force-with-lease。だからこれは私の見解です:

git() {
  if [[ $@ == 'push -f'* ]]; then
    echo Hey stupid, use --force-with-lease instead
  else
    command git "$@"
  fi
}

あなたに追加する.bash_profile.bashrcまたは.zshrc


1

代わりに置き換えgitて使用するbash関数を作成できます--force-with-lease--force

# replaces `git push --force` with `git push --force-with-lease`
git() {
  if [[ $@ == 'push -f'* || $@ == 'push --force'* ]]; then
    command git push --force-with-lease
  else
    command git "$@"
  fi
}

または、1行で:

git() { if [[ $@ == 'push -f'* || $@ == 'push --force'* ]]; then command git push --force-with-lease; else command git "$@"; fi; }

~/.bashrcまたはに追加するだけ~/.zshrcです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.