2014-03-25 18 views
18

這不可能在服務器上的repo中創建somme子子文件夾嗎?git push:refs/heads/my/subbranch存在,無法創建

,如果我這樣做:

git push origin dev/master 

一切工作找到

,但如果我這樣做

git push origin dev/sub/master 

我得到這個:

error: 'refs/heads/dev/sub' exists; cannot create 'refs/heads/dev/sub/master' 

我與「混帳分支檢查-r「,並直接與ssh, re不是已經創建的dev/sub文件夾。

有什麼不對?

+1

git ls-remote origin返回什麼? – Ikke

回答

31

這不是文件夾存在,它是分支。 (嗯,有可能會涉及到的地方,或者也許不是一個文件夾/目錄,作爲參考取得「打包」,並停止現有的目錄內的文件。)

  • 如果分支b存在,沒有名爲b/anything分支可創建。
  • 同樣,如果分支dev/b存在,dev/b/c不能創建。

這是一個git內部限制。在這種情況下,遠程origin有一個名爲dev/sub的分支(不管你是否擁有它,重要的是遠程是否擁有它)。爲了創建,在origin,一個分支命名dev/sub/master,必須先刪除origin命名dev/sub分支:

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分支。 (根據下面的評論,我懷疑那裏也有一個破壞的自動部署腳本,這可能應該修復爲只部署「可部署」的分支,而不是所有被推送的分支,但我只是在這裏猜測。)

+0

但爲什麼localy我可以做到這一點? 的Git分支給我: 主 開發/主 開發/子/主 開發/子/ BRANCH2 等 – Snyf

+0

@ user3458953:因爲你在本地沒有'裁判/頭的/ dev/sub'。你可能有'refs/remotes/origin/dev/sub',這是原始分支的跟蹤引用,但這是一個不同的名字,所以它不會發生衝突。請參閱不同存儲庫中分支的名稱空間是獨立的。 –

+0

此外,在刪除所有分支(exept master)之後,我仍然無法創建dev/sub/master – Snyf

12

我當時甚至無法獲取,因爲我的回購有關於我甚至沒有檢出的非現有遠程分支的信息。 我解決了它的運行組合(感謝@torek):

  • git branch -r列表的遠程分支機構
  • git ls-remote列表遠程分支機構
  • git fetch --prune origin更新遠程分支機構的本地副本(本地副本這其實沒」牛逼幫我
  • git remote prune origin刪除有關刪除遠程分支機構信息(這確實
2

試試這個命令來修復它:

git gc 

到當前的存儲庫中運行一些日常任務,並刪除不可達的對象(通過調用git prunegit fsck --unreachable)。

瞭解更多:git help gcgit help prune

0
#!/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自動運行XXX-exist-tags-delete.sh解決這些問題-errors.log使用下列命令:

  1. GIT中更新-REF -d參/標籤
  2. GIT中取
  3. GIT中拉
  4. 混帳推
2

currently accepted answer沒有幫助我,因爲我沒有在遠程回購一個裁判刪除 - 這純粹是我的地方!所以,如果你在這種情況下的時候,這裏是做什麼:

這是我面臨的問題:我試着接受答案的建議,但得到這個

$ 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 
+0

是的,你碰到的問題和'git remote prune origin'修復了它。謝謝! – ToddH

0

git remote prune origin固定的問題,對我來說