서버의 저장소에 somme 하위 폴더를 생성 할 수 없습니까?
만약 내가한다면:
git push origin dev/master
모든 일을 찾아
하지만 내가하면
git push origin dev/sub/master
알 겠어:
error: 'refs/heads/dev/sub' exists; cannot create 'refs/heads/dev/sub/master'
“git branch -r”로 확인하고 ssh로 직접 확인했는데 이미 생성 된 dev / sub 폴더가 없습니다.
뭐가 문제 야?
답변
존재 하는 폴더 가 아니라 브랜치 입니다. (음, 어딘가에 폴더 / 디렉토리가 관련되어있을 수도 있고, 참조가 “포장”되어 디렉토리 내에서 파일로 존재하는 것을 중지하기 때문에 아닐 수도 있습니다.)
- 분기
b
가있는 경우 명명 된 분기를b/anything
만들 수 없습니다 . - 마찬가지로 분기
dev/b
가 존재 하면dev/b/c
생성 할 수 없습니다.
이것은 git 내부 제한입니다. 이 특별한 경우에 remote origin
에는 이름이 지정된 브랜치가 있습니다 dev/sub
(사용 여부에 관계없이 중요한 것은 원격에 있는지 여부입니다). 에서 origin
라는 분기 를 만들려면 dev/sub/master
먼저 dev/sub
on 이라는 분기를 삭제해야합니다 origin
.
git push origin :dev/sub
(물론,이 지점을 삭제하면 그래서 당신이 당신이 무엇을하고 있는지 알고있을, 거기 중요한 무언가를 삭제할 수 있습니다. 일반적으로, 당신이 할 수 있습니다 git fetch origin
첫째, 캡처 자신의 dev/sub
로 origin/dev/sub
. 그런 다음라는 로컬 브랜치 할 수 dev/renamed-sub
같은 커밋을 가리키는를 , dev/renamed-sub
원격 에서 생성 , 원격 삭제 dev/sub
및 원격 에서 생성 dev/sub/master
.)
원격지 ( origin
호스팅되는 시스템)에 로그인 할 수 있으면 저기 저장소로 이동하여 로컬 dev/sub
브랜치의 이름을 바꿀 수 있습니다. (아래의 설명에 따르면 자동 배포 스크립트가 고장난 것 같습니다.이 스크립트는 푸시되는 모든 것이 아닌 “배포 가능한”브랜치 만 배포하도록 수정해야합니다.하지만 여기서 추측하고 있습니다.)
답변
내 저장소에 체크 아웃하지 않은 존재하지 않는 원격 지점에 대한 정보가 있기 때문에 가져올 수도없는 상태였습니다. 다음 조합을 실행하여 해결했습니다 (@torek에게 감사드립니다).
git branch -r
원격 지점의 로컬 사본 나열git ls-remote
원격 지점 나열git fetch --prune origin
원격 지점의 로컬 사본을 업데이트하십시오 ( 실제로 도움이되지 않았습니다 )git remote prune origin
제거 원격 지점에 대한 정보를 제거 ( 이했다 )
답변
나를 위해->
오류 =
fatal: cannot lock ref 'refs/heads/release/wl/2.3': 'refs/heads/release/wl'
exists; cannot create 'refs/heads/release/wl/2.3'
솔루션 =
$~ git update-ref -d refs/heads/release/wl
$~ git checkout release/wl/2.3
답변
현재 허용 대답은 내가 삭제 원격 REPO에 심판을 가지고 있지 않았기 때문에 나에게 도움이되지 않았다 – 내 지역에 순수했다! 따라서 이러한 상황에 처한 경우 수행 할 작업은 다음과 같습니다.
이것이 내가 직면 한 문제입니다.
$ git fetch origin
error: cannot lock ref 'refs/remotes/origin/fix/sub-branch':
'refs/remotes/origin/fix' exists; cannot create
'refs/remotes/origin/fix/sub-branch'
From <repo URL>
! [new branch] fix/sub-branch -> origin/fix/sub-branch
(unable to update local ref)
나는 받아 들여진 대답의 제안을 시도했지만 이것을 얻었습니다.
$ git push origin :fix
error: unable to delete 'fix': remote ref does not exist
error: failed to push some refs to <repo URL>
그래서 심판은 심지어 존재하지도 않았습니다. origin
그것은 분명히 내 로컬 저장소 어딘가에 어딘가에 매달려있었습니다. 그래서 나는 다음 $ git remote show me
을 생산했습니다.
Remote branches:
...
refs/remotes/origin/fix stale (use 'git remote prune' to remove)
...
그런 다음 솔루션을 명확하게 만들었습니다.
$ git remote prune origin
Pruning origin
URL: <redacted>
* [pruned] origin/fix
이것으로 문제가 사라졌습니다.
$ git fetch origin
remote: Counting objects: 5, done.
remote: Total 5 (delta 2), reused 2 (delta 2), pack-reused 3
Unpacking objects: 100% (5/5), done.
From <repo URL>
* [new branch] fix/sub-branch -> origin/fix/sub-branch
답변
이 명령을 사용하여 수정하십시오.
git gc
현재 저장소 내에서 여러 하우스 키핑 작업을 실행하고 연결할 수없는 개체를 제거합니다 ( git prune
및 을 호출 하여 git fsck --unreachable
).
더 읽어보기 : git help gc
그리고git help prune
답변
다른 모든 방법이 실패하면 저장소 시스템에 브랜치 이름에 대한 제한이 없는지 확인하십시오. 제 경우에는 SD-<number>
. 다른 이름을 지정하면 다음과 같은 일반 정보를 얻을 수 있습니다.
remote: error: cannot lock ref 'refs/heads/mybranch': 'refs/heads/mybranch/environment-variables' exists; cannot create 'refs/heads/mybranch'
To git.example.com:project/repository.git
! [remote rejected] mybranch -> mybranch (failed to update ref)
error: failed to push some refs to 'git@git.example.com:project/repository.git'
답변
#!/usr/bin/env bash
echo "update-ref delete refs/tags"
log="git-update-ref-errors.log"
script="./git-update-ref-exist-tags-delete.sh"
git_command="git update-ref -d refs/tags"
echo "log errors from ${git_command} to ${log}"
${git_command} 2>&1 | > ${log}
echo "show errors to ${log}"
cat ${log}
echo create ${script}
touch ${script}
echo "add execute (+x) permissions to ${script}"
chmod +x ${script}
echo "generate ${script} from errors log ${log}"
${git_command} 2>&1 | grep 'exists' | sed -n "s:.*\: 'refs/tags/\(.*\)' exists;.*:git tag -d '\1':p" >> ${script}
echo "execute ${script}"
${script}
echo fetch
log="git-fetch-errors.log"
script="./git-fetch-exist-tags-delete.sh"
git_command="git fetch"
echo "log errors from ${git_command} to ${log}"
${git_command} 2>&1 | > ${log}
echo "show errors from ${log}"
cat ${log}
echo create ${script}
touch ${script}
echo "add execute (+x) permissions to ${script}"
chmod +x ${script}
echo "generate ${script} from errors log ${log}"
${git_command} 2>&1 | grep 'exists' | sed -n "s:.*\: 'refs/tags/\(.*\)' exists;.*:git tag -d '\1':p" >> ${script}
echo "execute ${script}"
${script}
git fetch
echo pull
log="git-pull-errors.log"
script="./git-pull-exist-tags-delete.sh"
git_command="git pull"
echo "log errors from ${git_command} to ${log}"
${git_command} 2>&1 | > ${log}
echo "show errors from ${log}"
cat ${log}
echo create ${script}
touch ${script}
echo "add execute (+x) permissions to ${script}"
chmod +x ${script}
echo "generate ${script} from errors log ${log}"
${git_command} 2>&1 | grep 'exists' | sed -n "s:.*\: 'refs/tags/\(.*\)' exists;.*:git tag -d '\1':p" >> ${script}
echo "execute ${script}"
${script}
git pull
echo push
log="git-push-errors.log"
script="./git-push-exist-tags-delete.sh"
git_command="git push"
echo "log errors from ${git_command} to ${log}"
${git_command} 2>&1 | > ${log}
echo "show errors from ${log}"
cat ${log}
echo create ${script}
touch ${script}
echo "add execute (+x) permissions to ${script}"
chmod +x ${script}
echo "generate ${script} from errors log ${log}"
${git_command} 2>&1 | grep 'exists' | sed -n "s:.*\: 'refs/tags/\(.*\)' exists;.*:git tag -d '\1':p" >> ${script}
echo "execute ${script}"
${script}
git push
위의 스크립트는 XXX-errors.log에 오류를 기록하고 다음 명령을 사용하여 XXX-errors.log에서 XXX-exist-tags-delete.sh를 자동으로 생성하고 실행하여 오류를 수정합니다.
- git update-ref -d refs / tags
- 자식 가져 오기
- git pull
- git push