기본적으로 --force-with-lease 푸시


130

방금 배웠습니다 git push --force-with-lease. 꽤 굉장합니다. 그러나 물론 나는 그 힘을 자주 사용하지 않으므로 다음에 필요할 때이 멋진 기능을 잊어 버릴까 걱정됩니다.

git을 구성하는 방법이 있으므로 의도적으로 재정의하지 않는 한 git push -f자동으로 사용 됩니까?--force-with-lease--no-force-with-lease

(임대없이 힘을 사용하기를 원한다고 상상할 수 없습니다!)

답변:


141

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 repositorydocumentation 디렉토리를 살펴보십시오 . 여기에서 코딩 지침패치 제출 방법대한 정보를 찾을 수 있습니다 .

공식 커뮤니티 페이지 에서 이러한 모든 링크를 찾을 수 있습니다 .


25
표준 기능 ( "push --force")을 다시 작성하는 것에 대한 일반적인 주장은 기능이 아니라는 점에 대한 참고 사항입니다. 사용자는 명령에 익숙해지고 원점을 잊어 버린 후 언젠가는 새 시스템에서 실수로 이러한 명령을 사용한다는 것입니다. 많은 앨리어싱 같은 rmrm -i당신의 .bashrc에; 언젠가 서버에서 중요한 파일을 잊어 버리고 삭제합니다. 당신의 자신의 별명으로가는 것은 그 문제가 없습니다 :)
hraban

2
개인적인 일화 /주의 사항 : 에일리어싱을 시도했지만 에일 리어 스와 유사 해 보이기 때문에 pushf내가하지 않은 것을 항상 push -f재확인했다. push -f어쨌든 일부 팀원들은 별칭이 단지 미용적인 속기라고 생각하면서 사용 했습니다. 궁극적으로 안전한 양식의 별칭을 지정하고 pushfl걱정하지 않았습니다.
켈빈

31

다음에 필요할 때이 멋진 기능을 잊어 버릴까 걱정됩니다.

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합니다. 배경.


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. 를 제외하고 모든 매개 변수를 통해 자식으로 전달하는 사용자 지정 스크립트를 만듭니다. -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. "hey 멍청이"를 "hey, 당신은 온화하지만 단순한 영혼"으로 대체하거나 그런 식으로;)
VonC

5

OMYZSH를 사용하는 사람들은 간단히 사용할 수 있습니다 ggfl.


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
}

또는 한 줄로 :

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.