第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

go-git:創(chuàng)建本地分支的正確方法,模擬“git分支<分支名稱(chēng)>”的行為?

go-git:創(chuàng)建本地分支的正確方法,模擬“git分支<分支名稱(chēng)>”的行為?

Go
瀟湘沐 2022-08-24 17:00:59
正如標(biāo)題所示,我正在嘗試弄清楚如何以與Git CLI命令相同的結(jié)果的方式創(chuàng)建本地分支。go-gitgit branch <branchname>據(jù)我所知,(沒(méi)有明確的論據(jù))做了兩件事:git branch <branchname><start-point>創(chuàng)建以指向當(dāng)前提交.git/refs/heads/<branchname>HEAD用一行記錄分支的創(chuàng)建。.git/logs/refs/heads/<branchname>它可能會(huì)做得更多,但我知道這兩件事肯定是肯定的。(如果您知道更多的東西,請(qǐng)分享!接下來(lái)的大部分內(nèi)容都記錄了我在研究我的選擇時(shí)的發(fā)現(xiàn)之旅,我想我現(xiàn)在可能已經(jīng)掌握了上面的#1。但是,對(duì)于#2,我開(kāi)始認(rèn)為我可能是SOL,至少使用.go-git第一個(gè)想法:Repository.CreateBranch我最初天真的想法是打電話(huà),并且有一個(gè)類(lèi)似的SO問(wèn)題的答案(“如何使用go-git簽出一個(gè)新的本地分支?”),這似乎可以證明這個(gè)想法是可信的。但是一旦我開(kāi)始研究細(xì)節(jié),事情就變得非?;靵y。Repository.CreateBranch首先,采用 as 輸入(為什么?),并且似乎還修改了存儲(chǔ)庫(kù)的文件(再次,為什么?)。我已經(jīng)驗(yàn)證了該命令沒(méi)有觸及存儲(chǔ)庫(kù)的配置,并且當(dāng)我調(diào)用該命令時(shí),我當(dāng)然不需要提及有關(guān)配置的任何內(nèi)容。Repository.CreateBranchconfig.Config.git/configgit branch <branchname>其次,我上面鏈接的SO答案引用了 中的代碼,該代碼執(zhí)行以下操作:go-gitrepository_test.gor, _ := Init(memory.NewStorage(), nil) // init repotestBranch := &config.Branch{    Name:   "foo",    Remote: "origin",    Merge:  "refs/heads/foo",}err := r.CreateBranch(testBranch)但的定義是:config.Branchtype Branch struct {    // Name of branch    Name string    // Remote name of remote to track    Remote string    // Merge is the local refspec for the branch <=== ???    Merge plumbing.ReferenceName    ...}并且不是 refspec(因?yàn)?refspec 有一個(gè)分離它的和組件)。"refs/heads/foo":srcdst經(jīng)過(guò)大量的撓頭和代碼閱讀,我得出了(非常)初步的結(jié)論,即注釋中的“refspec”一詞一定是錯(cuò)誤的,它應(yīng)該只是“ref”。但我完全不確定這一點(diǎn):如果我是對(duì)的,那么為什么這個(gè)字段被命名而不是僅僅命名?MergeRef另一個(gè)初步的結(jié)論是,這并不是為了創(chuàng)建一個(gè)純粹的本地分支,而是為了創(chuàng)建一個(gè)本地分支,它與遠(yuǎn)程分支有某種關(guān)系 - 例如,如果我從遠(yuǎn)程數(shù)據(jù)庫(kù)中提取其他人的分支。Repository.CreateBranch實(shí)際上,在重讀 Repository.CreateBranch 方法時(shí),我根本不相信它真的創(chuàng)建了一個(gè)分支(也就是說(shuō),它創(chuàng)建了 )。除非我錯(cuò)過(guò)了一些東西(完全有可能),否則它似乎所做的就是在 中創(chuàng)建一個(gè)部分。但是,如果這是真的,為什么它是一種存儲(chǔ)庫(kù)的方法呢?為什么它不是一種方法?.git/refs/heads/<branchname>[branch "<name>"].git/configconfig.Config同樣,還有一個(gè)相關(guān)的函數(shù):func (r *Repository) Branch(name string) (*config.Branch, error)只會(huì)從配置中返回分支信息。然而,文檔中的下一個(gè)函數(shù)是:Repositoryfunc (r *Repository) Branches() (storer.ReferenceIter, error) 它確實(shí)返回了 中所有條目的迭代器。.git/refs/heads/這是非常令人困惑的,文檔(就像它一樣)無(wú)濟(jì)于事。無(wú)論如何,除非有人能說(shuō)服我,否則我很確定這對(duì)實(shí)際創(chuàng)建分支沒(méi)有多大幫助。CreateBranch
查看完整描述

2 回答

?
萬(wàn)千封印

TA貢獻(xiàn)1891條經(jīng)驗(yàn) 獲得超3個(gè)贊

首先,我沒(méi)有足夠的聲譽(yù)來(lái)評(píng)論P(yáng)edro的答案,但他的方法在階段失敗了,因?yàn)閷?shí)際上沒(méi)有在存儲(chǔ)上創(chuàng)建分支(從未調(diào)用存儲(chǔ)庫(kù))。CheckoutStorer


其次,這是我第一次聽(tīng)說(shuō)dir,所以不,不會(huì)為該dir中的分支創(chuàng)建記錄。.git/loggit branch


這就引出了實(shí)際的解決方案,即作為 go-git 存儲(chǔ)庫(kù)分支的示例提供的解決方案。


要?jiǎng)?chuàng)建分支(脫離 HEAD):

Info("git branch test")

branchName := plumbing.NewBranchReferenceName("test")

headRef, err := r.Head()

CheckIfError(err)

ref := plumbing.NewHashReference(branchName, headRef.Hash())

err = r.Storer.SetReference(ref)

CheckIfError(err)

簽出分支

Info("git checkout test")

w, err := r.Worktree()

CheckIfError(err)

err = w.Checkout(&git.CheckoutOptions{Branch: ref.Name()})

CheckIfError(err)

但是,這樣,在 中沒(méi)有此分支的配置,因此應(yīng)該有對(duì)函數(shù)的調(diào)用,但這確實(shí)是可笑的不直觀的。.git/configrepo.Branch


查看完整回答
反對(duì) 回復(fù) 2022-08-24
?
GCT1015

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超4個(gè)贊

我做到了:


創(chuàng)建對(duì)新分支的本地引用


branchName := "new-branch"

localRef := plumbing.NewBranchReferenceName(branchName)

創(chuàng)建分支


opts := &gitConfig.Branch{

    Name:   branchName,

    Remote: "origin",

    Merge:  localRef,

}


if err := repo.CreateBranch(opts); err != nil {

    return err

}

如果您確實(shí)需要更改為該分支...只是做一個(gè)結(jié)帳(不記得它是否實(shí)際更改為創(chuàng)建的分支與創(chuàng)建)


獲取工作樹(shù)


w, err := repo.Worktree()

if err != nil {

    return rest.InternalServerError(err.Error())

}

收款處


if err := w.Checkout(&git.CheckoutOptions{Branch: plumbing.ReferenceName(localRef.String())}); err != nil {

    return nil

}

如果要跟蹤遠(yuǎn)程分支


創(chuàng)建遠(yuǎn)程引用


remoteRef := plumbing.NewRemoteReferenceName("origin", branchName)

跟蹤遠(yuǎn)程


newReference := plumbing.NewSymbolicReference(localRef, remoteRef)


if err := repo.Storer.SetReference(newReference); err != nil {

   return err

}


查看完整回答
反對(duì) 回復(fù) 2022-08-24
  • 2 回答
  • 0 關(guān)注
  • 299 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)