답변:
AFAIK git force-with-lease대신 항상 사용하도록 구성 할 수있는 구성이 없습니다 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 repository 의 documentation 디렉토리를 살펴보십시오 . 여기에서 코딩 지침 과 패치 제출 방법 에 대한 정보를 찾을 수 있습니다 .
공식 커뮤니티 페이지 에서 이러한 모든 링크를 찾을 수 있습니다 .
pushf내가하지 않은 것을 항상 push -f재확인했다. push -f어쨌든 일부 팀원들은 별칭이 단지 미용적인 속기라고 생각하면서 사용 했습니다. 궁극적으로 안전한 양식의 별칭을 지정하고 pushfl걱정하지 않았습니다.
다음에 필요할 때이 멋진 기능을 잊어 버릴까 걱정됩니다.
Git 2.13 (2017 년 2 분기)은이 푸시 옵션에 대해 "보호"가없는 이유를 설명합니다. 하지 않는 상기 잊지 git push수준, 그것은 여전히 무시 될 수 있습니다.
Ævar Arnfjörð Bjarmason ( )의 commit f17d642 (2017 년 4 월 19 일)를 참조하십시오 . ( Junoio C Hamano 에 의해 합병) - 커밋 46bdfa3avar
gitster 2,017 26 사월)
push: 문서 및 시험--force-with-lease여러 리모컨으로동일한 URL을 가리키는 두 개의 리모컨이 있고 백그라운드 가져 오기 및 후속
git push --force-with-lease이 가져 오지 않은 업데이트되지 않은 참조를 방해하지 않는 경우에 대한 문서화 및 테스트 .Microsoft의 VSC와 같은 일부 편집기에는 백그라운드에서 자동 가져 오기 기능이
--force-with-lease--force-with-lease=<refname>있으며 여기에 추가 된 설명서에 명시된대로 & 에서 제공하는 보호 기능을 무시합니다 .
따라서 현재 문서git push 에는 다음이 포함됩니다.
안전에 대한 일반적인 참고 사항 : 예상 값없이이 옵션을 제공합니다 (예 :
--force-with-lease또는--force-with-lease=<refname>git fetch, 원격git fetch origin에서 크롤링 되는 백그라운드에서 (예 : cronjob의 리포지토리에서) 암시 적으로 실행되는 항목과 매우 심하게 상호 작용 합니다.그것이 제공하는 보호
--force작업이 기반으로하지 않은 후속 변경 사항이 방해받지 않도록 보장하지만 일부 백그라운드 프로세스가 백그라운드에서 참조를 업데이트하면 사소하게 무시됩니다. 원격 추적 정보 이외의 다른 정보는 없습니다.편집자 또는 다른 시스템이
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있을 것입니다.그것을 구현하는 방법 :
-fgit이 지침은 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
}
또는 한 줄로 :
git() { if [[ $@ == 'push -f'* || $@ == 'push --force'* ]]; then command git push --force-with-lease; else command git "$@"; fi; }
~/.bashrc또는에 추가하십시오 ~/.zshrc.
rm에rm -i당신의 .bashrc에; 언젠가 서버에서 중요한 파일을 잊어 버리고 삭제합니다. 당신의 자신의 별명으로가는 것은 그 문제가 없습니다 :)