回答:
私の知る限りでは、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リポジトリのドキュメントディレクトリを確認する必要があります。ここでは、コーディングのガイドラインとパッチの提出方法に関する情報を見つけることができます。
これらのリンクなどはすべて公式コミュニティページで確認できます。
pushf
がpush -f
、エイリアスに似ているため、を実行していないことを常にダブルチェックしました。push -f
とにかく、一部のチームメンバーは、エイリアスを単にその表面的な省略形だと考えて使用していました。最終的には、pushfl
代わりに安全なフォームのエイリアスを作成し、その心配をしなくなりました。
この気の利いた機能が次回必要になったときに忘れてしまうのではないかと心配しています。
このプッシュオプションに対しては、「保護」は、あなたがしてもいるので、忘れされていない理由の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
つまり、これまでに確認して上書きしたいアップストリームコードのバージョンのタグを作成し、履歴を再書き込みmaster
しbase
、ローカルでのremotes/origin/master
更新内容に関係なく、リモートバージョンがである場合は最後にプッシュ変更を強制します。バックグラウンド。
私の解決策は、ラッパースクリプトを作成し、エイリアスを使用して、常に実際のの代わりに使用することでした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
は、機能します。それを実装する方法:
-f
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
プッシュを強制しようとしたときに気が利くはずです。
代わりに置き換え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
です。
rm
ようrm -i
に。いつかサーバー上の重要なファイルを忘れて削除してしまいます。独自のエイリアスを使用しても問題はありません:)