标签: go-git

go-git:创建本地分支的正确方法,模拟“git分支 <branchname>”的行为?

正如标题所示,我试图弄清楚如何使用go-git与 Git CLI 命令给出相同结果的方式创建本地分支git branch <branchname>

据我所知,git branch <branchname>(没有明确的<start-point>论证)做了两件事:

  1. 创建.git/refs/heads/<branchname>指向当前HEAD提交
  2. .git/logs/refs/heads/<branchname>使用一行记录分支的创建进行创建。

它可能会做更多的事情,但我知道它肯定会做这两件事。(如果你知道更多它的作用,请分享!)

接下来的大部分内容记录了我在研究我的选择时的发现之旅,我想我现在可能已经掌握了上面的#1。不过,对于#2,我开始认为我可能是 SOL,至少使用go-git.

第一个想法:Repository.CreateBranch

我最初天真的想法是直接打电话Repository.CreateBranch,并且有一个类似的 SO 问题的答案(“如何使用 go-git 检查新的本地分支?”),这似乎为这个想法提供了可信度。但一旦我开始研究细节,事情就变得非常混乱。

首先,Repository.CreateBranch采用 aconfig.Config作为输入(为什么?),并且似乎还修改了存储库的.git/config文件(同样,为什么?)。我已经验证该git branch <branchname>命令不会触及存储库的配置,并且当我调用该命令时,我当然不需要提及有关配置的任何内容。

其次,我上面链接的 SO 答案引用了 中的代码,go-gitrepository_test.go代码执行以下操作:

r, _ := Init(memory.NewStorage(), nil) // init repo
testBranch := &config.Branch{
    Name:   "foo",
    Remote: "origin",
    Merge:  "refs/heads/foo",
}
err …
Run Code Online (Sandbox Code Playgroud)

git go go-git

9
推荐指数
2
解决办法
4846
查看次数

如何在 go 中使用 `go-git` 来模仿 `git --work-tree ...` ?

我有一个裸存储库,需要在其中添加并提交一组文件。据我了解,将文件添加到索引需要一个工作树git在命令行上使用时,我会将git-dir选项设置为指向裸目录,同时将选项设置work-tree为指向要添加到索引的文件所在的工作树。就像这样:

$ git --git-dir /path/to/.git --work-tree /path/to/worktree add ...
Run Code Online (Sandbox Code Playgroud)

值得一提的是,“.git”目录不是、也不可能简单地命名为“.git”。它实际上是一个“自定义”“.git”目录。喜欢git --git-dir /path/to/.notgit ...

我尝试设置core.worktree配置选项。然而,core.bare设置为true这个会导致致命错误。两者都来自命令行:

$ git --git-dir /path/to/.notgit config core.worktree /path/to/worktree
$ git --git-dir /path/to/.notgit add ...
warning: core.bare and core.worktree do not make sense
fatal: unable to set up work tree using invalid config
Run Code Online (Sandbox Code Playgroud)

并使用go-git

$ git --git-dir /path/to/.git --work-tree /path/to/worktree add ...
Run Code Online (Sandbox Code Playgroud)

我的一个想法是依靠该git.PlainOpenWithOptions功能,希望能够让我提供工作树作为一种选择。然而,看看git.PlainOpenOptions结构类型,这很快就崩溃了。

$ …
Run Code Online (Sandbox Code Playgroud)

git go go-git

9
推荐指数
1
解决办法
1219
查看次数

如何使用 go-git 进行合并?

由于mergerebase目前尚未实现,那么使用go-git将另一个分支的更改合并到活动分支的推荐方法是什么?

例如,假设我们的 master 分支有两个提交(m1 和 m2)。

master    m1 -- m2 -- m3
                 |
feature         m2 -- f1  -- f2

combined  m1 -- m2 -- m3  -- ?    <= what command(s) to merge/squash ?
Run Code Online (Sandbox Code Playgroud)

当时,我们基于master分支创建了一个feature分支,其最后一次提交是m2。

我们实现了一个新功能 f1,此时它应该只存在于功能分支中。

与此同时,我们的主分支正在不断发展。另一位开发人员将提交 m3 推送到了 master 分支。

之后,我们继续开发我们的功能分支并在 commit f2 中提交这些更改。

我们如何将功能分支更改(f1,f2)合并回主分支(m3)?

(您将执行什么命令来执行合并操作?)

merge go-git

7
推荐指数
0
解决办法
819
查看次数

可以指示git fetch pack提取单个树对象吗?

简而言之,我是否有办法从仅支持智能协议但不支持过滤器规范的git服务器中有效地(从空间角度)指定我想要的确切对象?

更多上下文:由于GitHub在pack协议中缺乏对过滤器规范的支持,我一直在尝试构建一种方法来获取一个数GB的存储库,其中单个提交也包含数GB。我的想法是使用want仅指定单个提交对象的a 的获取包请求(或服务器上的上传包),然后从那里获取该对象,获取其引用的树,在另一个请求中获取该树对象,然后手动指定我想要从那里的Blob和树对象。不过,我发现,从为想要“提交”的特定提交或树提供尽可能多的数据的角度来看,pack协议似乎可以正常运行。

这对于我正在执行的操作的意义是,无论何时指定树哈希的提交,我不仅会获得提交或树对象,而且还可以获得它们包含的每个对象。在使用加深设置来限制我想要的提交次数时,也会发生这种情况。0不产生任何结果,1产生上述结果。我已经验证过want,仅指定blob确实会导致带有该blob的打包文件,从而使该部分按预期工作。

git go-git

6
推荐指数
1
解决办法
137
查看次数

使用 go-git 从 GitHub Enterprise 克隆存储库

我正在尝试go-git从 GitHub Enterprise 克隆存储库。为此,我将 HTTPS 协议与访问令牌一起使用,该令牌对我的存储库具有适当的权限(在命令行上验证)。go-git进行git-upload-packRPC 调用时失败,因为服务器以 400 响应:

$ go run main.go
unexpected client error: unexpected requesting "https://github.mycompany.net/my-org/myrepo.git/info/refs?service=git-upload-pack" status code: 400
Run Code Online (Sandbox Code Playgroud)

它发出的请求相当于:

GET /my-org/myrepo.git/info/refs?service=git-upload-pack HTTP/1.1
Host: github.mycompany.net
User-Agent: git/1.0
Accept: */*
Authorization: Bearer atokenthatisdefinitelyvalid
Run Code Online (Sandbox Code Playgroud)

如果请求标头中没有令牌,我会Anonymous access denied从存储库中获得预期的 401 ( ) 响应。使用令牌,它以 400 响应。

我发现非企业 GitHub 上的公共存储库也是如此;不同之处在于它(预期)可以在没有Authorization标题的情况下工作,因为没有必要。如果我包含一个有效的令牌,GitHub 就像它的企业版一样以 400 响应。

下面是一个最小的例子。有没有办法go-git与需要身份验证的 GitHub Enterprise一起使用?理想情况下使用身份验证令牌?

package main

import (
    "fmt"
    "io/ioutil"

    git "gopkg.in/src-d/go-git.v4"
    "gopkg.in/src-d/go-git.v4/plumbing"
    "gopkg.in/src-d/go-git.v4/plumbing/transport/http"
)

const (
    repoURL           = …
Run Code Online (Sandbox Code Playgroud)

git github go go-git

5
推荐指数
1
解决办法
2306
查看次数

go-git:如何在远程服务器上进行身份验证?

我使用 go 项目go-git作为 git 客户端,并希望从通过gitea托管的私有 git 存储库中获取数据。

执行此操作的适当函数是func (r *Remote) Fetch(o *FetchOptions) error,它需要一个transport.AuthMethod对象进行身份验证。

我尝试了以下方法:

repo, _ := git.PlainOpen("/path/to/project/folder")
err := repo.Fetch(&git.FetchOptions{
    Auth: http.NewBasicAuth("someUser", "andThePassword"),
})
Run Code Online (Sandbox Code Playgroud)

...它只是返回:

无效的身份验证方法

如果我使用也会发生同样的情况

authenticator, _ := ssh.NewSSHAgentAuth("git")
Run Code Online (Sandbox Code Playgroud)

从包装中"gopkg.in/src-d/go-git.v4/plumbing/transport/ssh"

另外,如果我使用证书:

authenticator, _:= ssh.NewPublicKeysFromFile("gitea name", "/home/name/.ssh/id_rsa", "passphrase")
Run Code Online (Sandbox Code Playgroud)

如何找出支持哪种身份验证方法,以及是否有transport.AuthMethod我可以使用的现有实现?

git authentication go gitea go-git

4
推荐指数
1
解决办法
9067
查看次数

是否可以将 git diff 等同于 go-git

我每 10 秒拉一次存储库,并且需要检查每次拉后哪些文件发生了更改。

可以用 go-git 做到这一点吗?

git go go-git

4
推荐指数
1
解决办法
4903
查看次数

docker 多阶段构建 Go 映像 - x509:由未知权威签名的证书

我尝试使用私有公司网络中构建图像:

FROM golang:latest as builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN  GO111MODULE="on" CGO_ENABLED=0 GOOS=linux go build -o main ${MAIN_PATH}

FROM alpine:latest
LABEL maintainer="Kozmo"
RUN apk add --no-cache bash
WORKDIR /app
COPY --from=builder /app/main .
EXPOSE 8080
CMD ["./main"]
Run Code Online (Sandbox Code Playgroud)

并得到x509: certificate signed by unknown authority错误

Step 1/13 : FROM golang:latest as builder
 ---> 2421885b04da
Step 2/13 : WORKDIR /app
 ---> Using cache
 ---> 6555644dbd16
Step …
Run Code Online (Sandbox Code Playgroud)

go docker go-git docker-multi-stage-build go-build

4
推荐指数
2
解决办法
7125
查看次数

使用 go-git 克隆存储库后读取文件

我希望能够git使用go.

我最近发现了一个go-git非常方便的软件包。

我还能够执行pull操作,或多或少如下:

import {
  git "gopkg.in/src-d/go-git.v4"
}

repo, err := git.Clone(memory.NewStorage(), nil, &git.CloneOptions{
    URL: "https://github.com/pkaramol/myrepo",
})

err := repo.Pull(&git.PullOptions{
    RemoteName: "origin"
})

Run Code Online (Sandbox Code Playgroud)

我的问题是,假设我正在使用存储库的内存中签出(如上所述),我将如何go从存储库中读入(我的程序)文件?即假设文件

https://github.com/pkaramol/myrepo/someConfig.yaml
Run Code Online (Sandbox Code Playgroud)

是否最好(如果我只需要这个特定文件)仅对特定文件执行 git 克隆(仍在内存中) ?

git go go-git

1
推荐指数
1
解决办法
5041
查看次数

如何创建 Pull 请求或合并 PR

我能够将提取推送克隆到存储库。同样,是否可以使用 Go 创建拉取请求或合并 PR?

"gopkg.in/src-d/go-git.v4"
Run Code Online (Sandbox Code Playgroud)

git go go-git

-1
推荐指数
1
解决办法
1535
查看次数