[英]git pull, excluding a specific branch
我需要從遠程存儲庫中git pull
所有分支,但我想排除一個特定分支。 這是我的嘗試,基於我在https://git-scm.com/docs/git-pull上閱讀的內容,查看部分,排除分支:
$ git ls-remote | grep Bad-branch
From git@gitlab.mycompany.com:analytics/path/repo.git
181647289762f00110d67199adec2559a5dbbbe6 refs/heads/Bad-branch
$ git pull origin ^refs/heads/Bad-branch
There are no candidates for merging among the refs that you just fetched.
Generally this means that you provided a wildcard refspec which had no
matches on the remote end.
如您所見,這是行不通的。 如何指定要排除的分支?
我也參考了這些帖子,但我不想修改配置文件,只是一個臨時的命令行規范來忽略分支,直到它被刪除。
編輯:為了清楚起見,這是中斷的實際 git 調用,因為我在 Windows 上並且從分支名稱生成的路徑名給出了一個太長的文件名:
$ git pull
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 2), reused 3 (delta 2), pack-reused 0
Unpacking objects: 100% (3/3), 384 bytes | 16.00 KiB/s, done.
error: cannot lock ref 'refs/remotes/origin/TCCFOUR-19049-Algo-ProductionModuleLowDeltaT.R-distribution.supply.temperature.in.control.exception-displayed-as-YesNo-in-RDR-but-TrueFalse-in-analytic': Unable to create 'C:/Users/IRINZN/work/projects/analytic-r-docker-setup/analytic-r-cc4-algorithms/.git/refs/remotes/origin/TCCFOUR-19049-Algo-ProductionModuleLowDeltaT.R-distribution.supply.temperature.in.control.exception-displayed-as-YesNo-in-RDR-but-TrueFalse-in-analytic.lock': Filename too long
您只能使用git pull origin <branch-name>
更新單個分支
但是,如果您需要了解新分支,這將不起作用,我不知道有什么方法可以排除它。 您將需要刪除分支。
git pull
是兩個命令的組合。 git fetch
和git merge
。 git fetch
轉到遠程並檢查現有遠程分支的狀態以及是否存在任何新分支。 這是您的命令中斷的地方,因為 git 試圖創建這個新遠程分支的本地狀態。 如果您執行git branch -r
您將看到本地知道的所有遠程分支的列表。
您的最終編輯非常重要。
事實上,Git 的分支名稱和標簽名稱以及遠程跟蹤名稱等的數據庫實現得很差,再加上 Windows 上的文件名長度限制,是導致問題的原因。 它根本與git pull
無關,而是與 Git 處理遠程跟蹤名稱的創建和更新的方式有關( refs/remotes/origin/TCCFOUR-19049-Algo-ProductionModul...
)。 因此,當其他存儲庫中存在可笑的分支名稱並導致這些問題時,您暫時想要做的是避免要求您自己的 Git 創建此遠程跟蹤名稱。
最簡單的方法是使用限制git fetch
操作的refspec 1運行git fetch
或git pull
:
git fetch origin foobranch
例如,如果你想更新refs/remotes/origin/foobranch
。 完成后,您可以運行:
git merge origin/foobranch
或者:
git rebase origin/foobranch
作為適當的。 如果您希望在不首先檢查git fetch
結果的情況下快速執行這兩個操作,您可以使用方便的git pull
命令:
git pull origin foobranch
它將運行:
git fetch origin foobranch
(僅獲取一個命名分支並更新相應的origin/
名稱),然后是您已配置為git pull
默認第二個命令的git merge
或git rebase
。
1 Refspec是一個技術術語。 在這里,它相當粗略地翻譯為“分支名稱”,但這是一個極大的過度簡化。 但是讓我們不要在意這里的細節,把它留給其他答案。
我通常更喜歡將它們作為兩個單獨的命令運行,兩者都是為了理智——否則你會想知道為什么一個是foobranch
,一個是origin/foobranch
以及在fetch
和最終命令之間運行其他Git 命令的能力。
如果你仍然想知道為什么一個是foobranch
而另一個是origin/foobranch
, git fetch
本身就是原因:當你運行git fetch origin
,你告訴你的Git 在我存儲在名稱下的 URL 上調用其他一些 Git origin
。 你的 Git 有他們的 Git,它連接到他們的Git 存儲庫,列出他們的分支名稱。 它們有自己的分支名稱,因為每個 Git 存儲庫都有自己的分支名稱。 您的分支名稱不是他們的分支名稱。 你和他們共享提交,但不共享分支名稱。
無論如何,一旦他們列出了所有分支名稱,您的Git 現在就有機會獲取提交,以便您和他們可以共享它們。 因此,您的 Git 會查看其分支上的提交,以查看您是否已經擁有它們。 (請記住,一次提交可以在多個分支上,因此即使它們有 1000 個新分支,您也可能已經擁有所有提交!)然后您的 Git 會首先獲取您需要的任何新提交。 然后,在獲得所有提交后,您的 Git 獲取每個分支名稱並在您自己的存儲庫中創建或更新相應的遠程跟蹤名稱。 你的 Git 通過在每個分支名稱前面粘貼origin/
來做到這一點。
當你運行git fetch origin
,你是在告訴你的 Git:把他們所有的提交和分支都給我。 當您運行git fetch origin foobranch
,您是在告訴您的 Git:查看他們所有的分支,但只為我獲取 foobranch 的更新。 因此,這會將您的提取限制為更新您的origin/foobranch
所需的那些提交。
獲取完成並退出后,您將使用您的姓名origin/foobranch
而不是他們的姓名foobranch
來引用他們的最新提交。 如果您也希望將自己的分支之一foobranch
,那是您的事:他們不在乎您使用什么名稱。 您可能確實關心您使用的名稱,並使用他們故意使用的名稱。 但這不是他們需要關心的。 那是你要做的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.