我使用 git2go 在新克隆的目录上执行 AddAll() 和 CreateCommit()。 Push() 工作正常,当我将 Remote 克隆到另一个地方时,我得到了所有提交的文件。但是如果我在第一个目录中调用 git status
然后我得到:
(对不起德语,我没有正确的翻译,它的意思是分支与 origin/master 在同一位置,'gelöscht'
意思是 'deleted'
和 'Unbeobachtete dateien'
表示 'unwatched files'
)
Auf Branch master
Ihr Branch ist auf dem selben Stand wie 'origin/master'.
zum Commit vorgemerkte Änderungen:
(benutzen Sie "git reset HEAD <Datei>..." zum Entfernen aus der Staging-Area)
gelöscht: .gitignore
gelöscht: html/.gitignore
gelöscht: images/.gitignore
gelöscht: json/.gitignore
gelöscht: pjs/.gitignore
gelöscht: pjs/test37.pjs
gelöscht: pjs/test37.png
gelöscht: sounds/.gitignore
Unbeobachtete Dateien:
(benutzen Sie "git add <Datei>...", um die Änderungen zum Commit vorzumerken)
.gitignore
html/
images/
json/
pjs/
sounds/
我期望的是以下内容:
Nothing to commit. No files changed. (or similar)
我的代码:
// Add
repo, err := git.OpenRepository(dir)
index, err := repo.Index()
err = index.AddAll([]string{}, git.IndexAddDefault, nil)
treeId, err := index.WriteTreeTo(repo)
tree, err := repo.LookupTree(treeId)
// Commit
sig := &git.Signature{
Name: userName,
Email: userName + "@" + beego.AppConfig.String("userdata::emailserver"),
When: time.Now(),
}
commitId, err := repo.CreateCommit("HEAD", sig, sig, message, tree)
// Push
remote, err := repo.LookupRemote("origin")
err = remote.Push([]string{"refs/heads/master"}, nil, sig, message)
(我去掉了所有的错误处理,让它更短)
最佳答案
您正在打开当前存储库的索引:
index, err := repo.Index()
你正在改变它,并创建一个新的树,你随后从中创建一个提交:
err = index.AddAll([]string{}, git.IndexAddDefault, nil)
treeId, err := index.WriteTreeTo(repo)
与 git add
命令行不同,AddAll
没有将索引写回磁盘。此功能允许您将索引用作数据结构,而无需立即实际暂存更改。 (许多 libgit2 函数,如 merge 和 rebase,使用索引作为通用数据结构,您可以继续修改或转换为树。)
因此,此时,对索引的所有更改都保留在内存中。如果你想保留你的更改,你必须显式地将索引写回磁盘:
index.Write()
关于Git2go : After CreateCommit() all files appear like being added for deletion,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37026399/