이 베어 리포지토리로 푸시 할 수없는 이유는 무엇입니까? repository in /work/fun/git_experiments/bare/ $ git clone

이 워크 플로우의 문제점을 설명 할 수 있습니까?

$ git init --bare bare
Initialized empty Git repository in /work/fun/git_experiments/bare/
$ git clone bare alice
Cloning into alice...
done.
warning: You appear to have cloned an empty repository.
$ cd alice/
$ touch a
$ git add a
$ git commit -m "Added a"
[master (root-commit) 70d52d4] Added a
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 a
$ git push
No refs in common and none specified; doing nothing.
Perhaps you should specify a branch such as 'master'.
fatal: The remote end hung up unexpectedly
error: failed to push some refs to '/work/fun/git_experiments/bare'

git push내가 복제 한 저장소로 항상 푸시 하지는 않습니까?



답변

예, 문제는 “베어”에 커밋이 없다는 것입니다. 이것은 순서대로 저장소를 작성하는 경우 (첫 번째, 앨리스) 첫 번째 커밋에서만 발생하는 문제입니다. 시도해보십시오 :

git push --set-upstream origin master

이것은 처음에만 필요합니다. 나중에 정상적으로 작동합니다.

Chris Johnsen이 지적했듯이 push.default가 사용자 정의되어 있으면이 문제가 발생하지 않습니다. 나는 상류 / 추적을 좋아한다.


답변

만약 너라면:

 git push origin master

맨손으로 리포 지합니다.

Alice Repo가 올바르게 추적하지 않는 것 같습니다.

cat .git/config

기본 원격 및 분기가 표시됩니다.

만약 너라면

 git push -u origin master

원격 및 지점 추적을 시작해야합니다. 해당 옵션이 항상 자식인지 확실하지 않습니다.


답변

이 관련 질문에 대한 답변은 저에게 해결책을 제공했습니다 … 그것은 단지 멍청한 실수였습니다.

먼저 커밋하십시오!

https://stackoverflow.com/a/7572252

아직 로컬 리포지토리에 커밋하지 않은 경우 푸시 할 내용이 없지만 Git 오류 메시지가 도움이되지 않습니다.


답변

git push --all

모든 것을 새로운 베어 리포지토리로 푸시하는 정식 방법입니다.

동일한 작업을 수행하는 또 다른 방법은 새로운 비 저장 리포지토리를 만든 다음 다음과 같이 베어 클론을 만드는 것입니다.

git clone --bare

그런 다음 사용

git remote add origin <new-remote-repo>

원래 (비 베어) 저장소에.


답변

alice밀어 넣기 전에 저장소 에서 이것을 시도하십시오 .

git config push.default tracking

또는을 사용하여 사용자의 기본값으로 구성하십시오 git config --global ….


git push기본적으로 origin리포지토리 (일반적으로 현재 리포지토리를 복제 한 리포지토리)로 설정되지만 기본적으로 현재 분기를 푸시하지는 않습니다. 기본적으로 소스 리포지토리와 대상 리포지토리 모두에있는 분기 만 푸시합니다.

push.default구성 변수 (참조 자식-설정을 (1) ) 어떤 컨트롤 git push이 (저장소 이름 뒤에 즉, 무언가를) 어떤 “refspec”인자가되지 않을 때 밀어 것입니다. 기본값은 위에서 설명한 동작을 제공합니다.

가능한 값은 다음과 같습니다 push.default.

  • nothing
    이렇게하면“refspec”이 제공됩니다.

  • matching(기본값) 소스 리포지토리와 대상 리포지토리에 모두 존재하는 모든 분기를
    푸시 합니다.
    이것은 현재 체크 아웃 된 브랜치와 완전히 독립적입니다.

  • upstream또는 tracking
    (두 값 모두 같은 의미입니다. 후자는 “원격 추적”분기와 혼동을 피하기 위해 더 이상 사용되지 않습니다. 전자는 1.7.4.2에 도입되었으므로 Git 1.7.3.1을 사용하는 경우 후자를 사용해야합니다. )
    현재 분기를 “업스트림”구성으로 지정된 분기로 푸시합니다.

  • current
    이것은 현재 브랜치를 목적지 저장소에서 동일한 이름의 브랜치로 푸시합니다.

    이 마지막 두 개는 일반적인 경우 (예 : 오리진 / 마스터 를 업스트림으로 사용 하는 로컬 마스터에서 작업 )와 동일하지만 로컬 브랜치의 이름이 “업스트림”브랜치와 다른 경우에는 다릅니다.

    git checkout master
    # hack, commit, hack, commit
    
    # bug report comes in, we want a fix on master without the above commits
    
    git checkout -b quickfix origin/master  # "upstream" is master on origin
    # fix, commit
    git push
    

    push.default동일 upstream(또는 tracking), 푸시는에 갈 것 origin‘의 마스터 지점입니다. 이 같을 때 current, 푸시는에 갈 것 origin‘의 quickfix 지점.

matching설정이 업데이트됩니다 bare마스터 가 설립 된 후 시나리오에서. 그것을 설정하기 위해 git push origin master한 번 사용할 수 있습니다 .

그러나 upstream설정 (또는 current)은 예상 한 결과와 더 잘 일치하는 것처럼 보이므로 시도해 볼 수 있습니다.

# try it once (in Git 1.7.2 and later)
git -c push.default=upstream push

# configure it for only this repository
git config push.default upstream

# configure it for all repositories that do not override it themselves
git config --global push.default upstream

(또한 1.7.4.2 이전에 여전히 Git을 사용하고 있다면 tracking대신 에을 사용해야 합니다 upstream.)


답변

SourceTree git client를 사용 하는데 초기 commit / push 명령은 다음과 같습니다.

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v --tags --set-upstream origin master:master


답변