Closed1

go-gitでdiffとるやつ

黒ヰ樹黒ヰ樹

https://github.com/go-git/go-git

一番欲しい情報を得るのに苦労したので。

package main

import (
	"fmt"
	"log"

	"github.com/go-git/go-git/v5"
)

func main() {
	repo, err := git.PlainOpen(".")
	if err != nil {
		log.Fatal(err)
	}
	headRef, err := repo.Head()
	if err != nil {
		log.Fatal(err)
	}
	headCommit, err := repo.CommitObject(headRef.Hash())
	if err != nil {
		log.Fatal(err)
	}
	prevCommit, err := headCommit.Parents().Next()
	if err != nil {
		log.Fatal(err)
	}
	headTree, err := headCommit.Tree()
	if err != nil {
		log.Fatal(err)
	}
	prevTree, err := prevCommit.Tree()
	if err != nil {
		log.Fatal(err)
	}
	patch, err := prevTree.Patch(headTree)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(patch.String())
}

40バイトのオブジェクト名が表示されるのでgit diff --full-index HEAD~1と同じ結果が得られる。
hunk headerの設定によっては結果が異なるかも。

ただgo-gitはgit applyと互換性がないらしい。
なんてこったい。

https://github.com/go-git/go-git/blob/main/COMPATIBILITY.md

go-gitとgo-gitdiffを組み合わせればいけそう。

https://github.com/bluekeyes/go-gitdiff

このスクラップは2ヶ月前にクローズされました