У меня есть этот кусок кода, который вызывается много раз, и в конце концов через несколько дней я получаю сообщение об ошибке нехватки памяти. Включение и выключение приложения всегда освобождает память и заставляет ее работать. Я занимался исследованиями, но не могу найти что-то, чтобы помочь мне. Я думаю, что у меня утечка памяти при выполнении клонирования в памяти репозитория github. Я делаю это, чтобы получить последний идентификатор фиксации для ветви. Я пытался выяснить, как освободить эту память после получения идентификатора коммита. Может быть, кто-нибудь знает лучший способ получить последний github-репо из репозитория?
с помощью gopkg.in/src-d/go-git.v4
import (
"gopkg.in/src-d/go-git.v4"
"gopkg.in/src-d/go-git.v4/plumbing"
"gopkg.in/src-d/go-git.v4/plumbing/object"
"gopkg.in/src-d/go-git.v4/storage/memory"
"github.com/gorilla/mux"
"fmt"
"bufio"
"encoding/json"
"net/http"
"os"
"strings"
)
func GetLastCommit(repo string, branch string, comments bool) string {
var username string
var password string
var giturl string
var counter int
var s string
var c2 int
var cID string
var cDev string
var cComment string
var returnString string
username = os.Getenv("gituser")
password = os.Getenv("gitkey")
giturl = os.Getenv("giturl")
giturl = fmt.Sprintf("https://%s:%s@%s%s", username, password, giturl, repo)
counter = 0
res, err := git.Clone(memory.NewStorage(), nil, &git.CloneOptions{
URL: giturl,
ReferenceName: plumbing.ReferenceName(fmt.Sprintf("refs/heads/%s", branch)),
SingleBranch: true,
})
if err != nil {
fmt.Printf("Error cloning branch: ", err)
} else {
// retrieve the branch pointed by HEAD
ref, err := res.Head()
if err != nil {
fmt.Printf("error in retrieve branch: ", err)
} else {
// retrieve the commit history
cIter, err := res.Log(&git.LogOptions{From: ref.Hash()})
if err != nil {
fmt.Printf("error in retrieve commit history from branch: ", err)
} else {
// iterate over the commits, printing it
err = cIter.ForEach(func(c *object.Commit) error {
if counter < 1 {
//fmt.Println(c)
s = fmt.Sprintf("%s", c)
c2 = 0
for _, line := range strings.Split(strings.TrimSuffix(s, "\n"), "\n") {
if c2 == 0 {
// This is the commit ID
subStr := strings.Split(line, " ")
fmt.Printf("Commit ID: %s\n", strings.TrimSpace(subStr[1]))
cID = strings.TrimSpace(subStr[1])
} else if c2 == 1 {
// This is the developer's ID
subStr := strings.Split(line, ":")
fmt.Printf("Dev: %s\n", strings.TrimSpace(subStr[1]))
cDev = strings.TrimSpace(subStr[1])
} else if c2 == 4 {
// This is the commit comments
fmt.Printf("Comment: %s\n", strings.TrimSpace(line))
cComment = strings.TrimSpace(line)
}
c2 = c2 + 1
}
}
counter = counter + 1
return nil
})
}
}
}
if comments {
returnString = fmt.Sprintf("Most recent commit %s by %s. Comments: %s", cID, cDev, cComment)
} else {
returnString = fmt.Sprintf("%s", cID)
}
return(returnString)
}