package main import ( "fmt" "os" git "github.com/go-git/go-git/v5" . "github.com/go-git/go-git/v5/_examples" "github.com/go-git/go-git/v5/plumbing/protocol/packp/capability" "github.com/go-git/go-git/v5/plumbing/transport" "github.com/go-git/go-git/v5/plumbing/transport/http" ) func main() { CheckArgs("", "", "", "") url, directory, username, password := os.Args[1], os.Args[2], os.Args[3], os.Args[4] // Clone the given repository to the given directory Info("git clone %s %s", url, directory) // Azure DevOps requires capabilities multi_ack / multi_ack_detailed, // which are not fully implemented and by default are included in // transport.UnsupportedCapabilities. // // The initial clone operations require a full download of the repository, // and therefore those unsupported capabilities are not as crucial, so // by removing them from that list allows for the first clone to work // successfully. // // Additional fetches will yield issues, therefore work always from a clean // clone until those capabilities are fully supported. // // New commits and pushes against a remote worked without any issues. transport.UnsupportedCapabilities = []capability.Capability{ capability.ThinPack, } r, err := git.PlainClone(directory, false, &git.CloneOptions{ Auth: &http.BasicAuth{ Username: username, Password: password, }, URL: url, Progress: os.Stdout, }) CheckIfError(err) // ... retrieving the branch being pointed by HEAD ref, err := r.Head() CheckIfError(err) // ... retrieving the commit object commit, err := r.CommitObject(ref.Hash()) CheckIfError(err) fmt.Println(commit) }