我正在使用libgit2sharp(libgit2的C#包装器)并且一直在遇到问题,因为它没有很多我希望的功能(希望我能尽快做出贡献;这看起来像是一个非常有用的项目)
我现在要做的是获取从特定提交及其父级更改的文件列表.我不会试图找出合并与其两个父母之间的变化.我对常规提交更感兴趣.
这些家伙(https://github.com/libgit2/libgit2sharp/issues/89)正在研究类似的东西.我认为他们的程序是一个合理的想法,但我对GIT内部的理解有点弱(最终用户的GIT指南有很多指南,但内部结构却没有那么多)
我很好奇GIT本身如何执行"git diff"命令.据说GIT实际上并不存储增量,而是文件的完整版本(如果它没有改变,它只会指向现有的SHA.这些信息可以从各种来源找到,例如http://xentac.net/2012/01 /19/the-real-difference-between-git-and-mercurial.html).这似乎使得更难以在两次提交之间进行更改(在我的情况下是特定提交及其单个父级),因为数据不是作为提交的一部分存储的(如果您检查libgit2sharp的Commit.cs中的Commit类,这很明显)文件).
我可以通过提交访问的是树.是否有必要执行以下操作以查找此信息:
1)从所需的提交开始,然后沿着树向下走,并将所有SHA值存储在一个集合中.
2)从父级开始进行所需的提交,然后沿着其树向下移动,将其所有blob SHA值存储在另一个集合中.
3)更改文件的SHA将是不在两组交集中的文件.
我用这种方法看到的问题是它看起来没有办法从blob的SHA值中获取文件名(我没有看到任何可以在libgit2sharp的Blob.cs文件中执行此操作).
我知道这个问题有很多方面,但它们是从git获取特定数据的大目标的一部分.
谢谢.
嗨,我喜欢Git,但似乎与人和朋友分享Windows项目并不好玩,因为与tortoisehg或tortoisesvn(不是它的DVCS)相比,gitextensions tortoisegit开箱即用是丑陋的.在bash shell中使用msysgit并不像linux/Mac那样好.
那么有没有新的竞争者(alpha项目等(甚至与其他libs))?
我很想看到这些新的Git库腾飞!
我正在尝试使用libgit2执行以下操作:
git log -z --all --topo-order
Run Code Online (Sandbox Code Playgroud)
我遇到了以下问题:1)找到最简单的方法将所有裁判推入到revwalker中; 2)以相同的顺序获得结果.虽然我尝试过拓扑和时间排序的各种组合,但我仍然看到较旧的分支出现在顶部附近.
我的最新尝试包括打电话git_revwalk_push_glob(walk, "refs/*"),但不是所有的分支都出来了.一个测试仓库有两个本地分支,一个(当前一个)缺失.
我实际上是在Objective-git中这样做,但是GTEnumerator接口有点受限,所以我不得不扩展它.
更新:我继续手动推送refs/heads,refs/remotes和refs/tags(以及所有stashes,因为我实际上想要的不仅仅是顶部).订购问题仍然存在.
我试图找出如何将克隆选项传递给nodegit克隆方法.
节点git文档声明克隆方法的第3个参数是克隆选项对象 http://www.nodegit.org/nodegit/#Repo-clone
git.Repo.clone(URL, path, CloneOptions, callback);
Run Code Online (Sandbox Code Playgroud)
但是,此对象不包含在nodegit的标准版本中.
我已将clone_options.cc文件的绑定添加到bindings.gyp文件中,我可以访问克隆选项对象.但是,我无法弄清楚如何使用有效的分支名称实例化它.libgit2 api显示该选项是checkout_branch http://libgit2.github.com/libgit2/#HEAD/type/git_clone_options
任何人都有任何关于如何做到这一点的见解?或者在支持克隆节点中的git分支的替代库中?
var CloneOptions = nodegit.CloneOptions;
var options = new CloneOptions({checkout_branch: branchName});
git.Repo.clone(url, temp, options, function (err, repo) {...});
Run Code Online (Sandbox Code Playgroud)
结果是
Error: git_clone_options is required.
Run Code Online (Sandbox Code Playgroud)
nodegit的github问题页面上还有一个开放的线程
我想实现的东西,这将使我的结果git pull或git fetch && git merge.我得到了这个部分工作,但我遇到的问题是,在运行以下代码后,当前的repo仍然认为有本地更改要提交.
据我所知,我相信我可能没有从正确的HEAD创建带注释的提交,或者我需要再次提交?(我不确定).
我的代码看起来像这样,我被困住了:
func (repo *Repo) Pull() error {
// Get remote
remote, err := repo.Remotes.Lookup("origin")
if err != nil {
remote, err = repo.Remotes.Create("origin", repo.Path())
if err != nil {
return err
}
}
// Get the branch
branch, err := repo.Branch()
if err != nil {
return err
}
// Get the name
branchName, err := branch.Name()
if err != nil {
return err
}
if err := …Run Code Online (Sandbox Code Playgroud) 我试图使用libgit2获取git存储库中所有对象ID的列表.我似乎无法找到任何方法.libgit2有一个方法来获取所有对象ID(或迭代它们),还是我需要手动读取它们?
我正在尝试git log filename使用pygit2在git裸存储库中进行相当的操作.该文档仅解释了如何执行git log此操作:
from pygit2 import GIT_SORT_TIME
for commit in repo.walk(oid, GIT_SORT_TIME):
print(commit.hex)
Run Code Online (Sandbox Code Playgroud)
你有什么主意吗?
谢谢
编辑:
我现在有类似的东西,或多或少精确:
from pygit2 import GIT_SORT_TIME, Repository
repo = Repository('/path/to/repo')
def iter_commits(name):
last_commit = None
last_oid = None
# loops through all the commits
for commit in repo.walk(repo.head.oid, GIT_SORT_TIME):
# checks if the file exists
if name in commit.tree:
# has it changed since last commit?
# let's compare it's sha with the previous found sha
oid = commit.tree[name].oid
has_changed …Run Code Online (Sandbox Code Playgroud) 我有一个相对较短的Gist,它应该libgit2用来模拟git pull命令的功能.不幸的是,它并没有完全奏效.
总之,代码片段:
git_repository_open()打开磁盘上的存储库git_remote_load()以获取git_remote *名为"origin"的远程控件git_remote_connect()用GIT_DIRECTION_FETCH旗帜打电话git_remote_download()从远程获取对象根据git_remote_stats(),物体确实被取出.但工作目录不会更改以反映最新提交.我尝试添加:
git_checkout_head(repo, NULL);
Run Code Online (Sandbox Code Playgroud)
......但这没有任何区别.
输入:
git checkout master
...在终端中产生以下输出:
Already on 'master' Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.
我如何快进?
有时我会尝试同时读取和写入Git存储库.但后来当我尝试提交文件时,我收到以下错误消息:
libgit2引发了一个错误.Category = Index(LockedFile).索引已锁定.这可能是由于同意或崩溃的过程.
提交按预期完成,为什么我收到此错误消息?我怎么摆脱它?
(如果LibGit2Sharp开发人员看到这一点:错误消息中存在拼写错误:concuRRRent.):D
在使用libgit2的C++中,我想创建一个新的本地存储库,其master分支基于specific-branch另一个本地存储库,保持其历史记录,以便稍后我可以在两者之间同步.
基本上,我尝试以下,除了使用libgit2:
所以,如果我的文件安排如下:
./old.git [branches:master,specific-branch]
./old/*[特定分支的./old.git文件和克隆]
命令的位置如下:
git init --bare ./new.git
cd ./old
git push ./new.git +specific-branch:master
Run Code Online (Sandbox Code Playgroud)
并想出类似的东西(删除错误检查以减少代码):
git_libgit2_init();
git_repository* repo = nullptr;
git_repository_init(&repo, "./new.git", true);
git_remote_create(&remote, repo, "origin", "./new.git");
git_remote_add_push(repo, "origin", "+specific-branch:master");
git_push_options optionsPush = GIT_PUSH_OPTIONS_INIT;
git_remote_push(remote, nullptr, &optionsPush);
Run Code Online (Sandbox Code Playgroud)
我不确定的是从这里开始的地方以及如何git_remote_push()正确地调用实际执行某些操作的地方.目前没有副作用,因为./old.git没有参考.也就是说,./new.git是正确创建的,但它不包含./old.git/的内容./old/*.
非常感谢.
基于建议采用"获取"方法的答案,我还尝试了以下方法:
git_repository* repo = nullptr;
if (git_repository_init(&repo, "./new.git", true)) {
FATAL();
}
git_remote* remote;
git_remote_create_anonymous(&remote, repo, "./old");
char* specs[] = { _strdup("specific-branch:master"), nullptr …Run Code Online (Sandbox Code Playgroud)