亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何識別 git 提交之間哪些文件已更改

如何識別 git 提交之間哪些文件已更改

Go
不負相思意 2023-08-07 10:59:29
我們如何使用 go-git 生成類似于 的兩次提交之間已更改的所有文件的列表git diff --name-only commit1 commit2?對于上下文,我們有一個 git monorepo,其中包含單個根go.mod文件但多個 Go 應用程序。當開發人員將提交推送到分支時,我們希望獲取兩次 git 提交 (?git diff --name-only) 之間更改的所有文件的列表,并將其過濾到應用程序目錄列表中,同時排除某些目錄。我們的最終目標是這樣我們就可以構建、部署和測試我們的 monorepo 中發生更改的應用程序。我們有一個類似于 Shippable 的 bash 腳本來執行此操作,但我們想使用純 go 和 go-git。
查看完整描述

1 回答

?
慕絲7291255

TA貢獻1859條經驗 獲得超6個贊

看起來change.Files()只給出了帶有 的文件的名稱to.Name,沒有存儲庫內的路徑,但是change.toString()給出了完整路徑。

因此,如果您想使用Tree.Diff,您必須獲取如下路徑:

func getChangeName(change *object.Change) string {

? ? ? ? var empty = object.ChangeEntry{}

? ? ? ? if change.From != empty {

? ? ? ? ? ? return change.From.Name

? ? ? ? }


? ? ? ? return change.To.Name

}

因此,看起來您可以根據您的需要選擇Tree.Diff或Patch.Stats :

? ?currentTree, err := commit.Tree()

? ? CheckIfError(err)


? ? prevTree, err := prevCommit.Tree()

? ? CheckIfError(err)


? ? patch, err := currentTree.Patch(prevTree)

? ? CheckIfError(err)

? ? fmt.Println("----- Patch Stats ------")


? ? var changedFiles []string

? ? for _, fileStat := range patch.Stats() {

? ? ? ? fmt.Println(fileStat.Name)

? ? ? ? changedFiles = append(changedFiles,fileStat.Name)

? ? }


? ? changes, err := currentTree.Diff(prevTree)

? ? CheckIfError(err)

? ? fmt.Println("----- Changes -----")

? ? for _, change := range changes {

? ? ? ? // Ignore deleted files

? ? ? ? action, err := change.Action()

? ? ? ? CheckIfError(err)

? ? ? ? if action == merkletrie.Delete {

? ? ? ? ? ? //fmt.Println("Skipping delete")

? ? ? ? ? ? continue

? ? ? ? }

? ? ? ? // Get list of involved files

? ? ? ? name := getChangeName(change)

? ? ? ? fmt.Println(name)

? ? }

Patch.Stats將跳過二進制文件,而Tree.Diff將讓您忽略刪除。



查看完整回答
反對 回復 2023-08-07
  • 1 回答
  • 0 關注
  • 137 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號