下载一个GitLab私有仓库

30

我想使用curl下载我的GitLab私有仓库。我知道可以使用Gitlab API,但由于某些原因,它无法正常工作。

这种方法可行吗?每当我尝试这样做时,它总是返回登录页面。

5个回答

43

这是可能的,只需按照以下步骤进行:

  1. 首先,您需要创建一个“个人访问令牌”:

    1. 转到您的个人资料 > 设置 > 访问令牌

    2. 为您的“个人访问令牌”输入名称。

    3. 勾选“api访问已验证用户的API”

      Personal Access Tokens

    4. 点击“创建个人访问令牌”

    5. 页面将重新加载并保存您的新令牌。

    6. 确保您将令牌保存在安全的地方,否则您将无法再次查看它。

      New "Personal Access Token"

  2. 现在您有了“个人访问令牌”,您需要获取项目ID以使用API:

    1. 转至https://gitlab.com/api/v4/projects?private_token=XXXXXXXXXXXXXXXXXXXX(将X替换为您的新令牌)

    2. 从json中获取您的项目ID。

      Project id

    (或者您可以直接从其网页复制项目ID)

  3. 现在您可以调用:

 wget -O your_project.tar.gz https://gitlab.com/api/v4/projects/0000000/repository/archive?private_token=XXXXXXXXXXXXXXXXXXXX

然后这将会把你的项目以.tar.gz文件的形式下载下来。

编辑:如果你想要获取特定提交/标签的tarball,可以将&sha=...参数添加到URL中,例如: https://gitlab.com/api/v4/projects/24470128/repository/archive?private_token=XXXXXXXXXXXXX&sha=606e81c69eff27eccbbc59a0546a9439780dff55


2
API V3不再受支持 :( - OriolJ
5
只需将v3替换为v4即可。 - Tristan CHARBONNIER
1
有任何想法如何获取特定标签的tarball吗? - Edwin Diaz
最终的URL将返回一个文件,其文件名相当复杂:myrepo-master-355be558eac20b8747727e82377522fad73b5f6e.zip。是否可以强制指定归档文件的名称?例如“archive.zip”。我需要这样做是因为我无法在composer存储库中指定文件名。 - Ninj
我在GitLab上有一个项目,我按照步骤创建了令牌并找到了项目ID。我的存储库是内部存储库。之后,在Web浏览器上,存储库下载正常工作,但是使用wget或curl下载时会下载空的tar.gz文件。 - jkumar_99
显示剩余2条评论

13
您可以使用您自己的私有令牌(在“个人资料设置”中找到)访问任何资源。只需浏览到要下载的存储库文件,复制“原始”文件链接并添加 ?private_token=...。
示例:
curl https://git.local/user1/myrepo/raw/master/myfile.txt?private_token=ahgiretherghaeoi

1
问题是关于下载整个仓库,而不仅仅是一个文件。 - Frak
4
当我尝试下载原始文件时,收到以下信息:<html><body>You are being <a href="https://gitlab.com/users/sign_in">redirected</a>.</body></html>。意思是你正在被重定向到一个链接。 - Amin Ya
下载单个文件请查看此链接:https://dev59.com/81MI5IYBdhLWcg3wJ38S#66220822 - Amin Ya

6
你可以这样做,但是你需要进行身份验证(例如“Gitlab API:如何生成私有令牌”中所述)。
curl http://gitlab.server/api/v3/session --data 'login=myUser&password=myPass'

然后使用私有令牌
curl --header "PRIVATE-TOKEN: QVy1PB7sTxfy4pqfZM1U" "http://example.com/api/v3/projects"

或者在你的情况下,获取存储库文件

GET /projects/:id/repository/files

或者,直接下载一个文件。


1
有没有办法获取公共原始URL而不是可下载的URL?例如,图像文件的公共URL可以在浏览器中查看。是否有任何方法可以使用API生成私有repo的公共URL? - Khurshid Alam
@KhurshidAlam,您的意思是公共URL可以被所有人访问,即使它来自私有存储库? - VonC
是的,但只能使用一些令牌。就像Bitbucket或GitHub一样。例如,Bitbucket使用附加到文件原始URL的令牌,以便可以公开查看它。https://bytebucket.org/$username/$repo/raw/$sha/$filename.jpg?token=$sometoken - Khurshid Alam

3

如果您拥有自己的“个人访问令牌”(如其他答案所述),您可以使用curl命令下载存储库分支的归档文件:

curl -k --header "PRIVATE-TOKEN: xxxx" https://gitlab.xxxxx/api/v4/projects/<projectID>/repository/archive?sha=630bc911c1c20283d3980dcb95fd5cb75479bb9c -o myFilename.tar.gz

项目ID会显示在存储库的主页上。 您可以从WebUI中选择所需分支后,从下拉菜单中复制右侧SHA值来获取SHA值。请参见以下截图: enter image description here 另一种方法是通过wget实现:
wget --no-check-certificate -O myFilename.zip --header=PRIVATE-TOKEN:xxxx "https://gitlab.xxxx/api/v4/projects/<projectID>/repository/archive.zip?sha=630bc911c1c20283d3980dcb95fd5cb75479bb9c"

我希望这能有所帮助。

gitlab.xxxxx 是什么?我猜 .xxxxx 不是一个有效的顶级域名... - Klesun
gitlab.xxxxx 是一个泛指,代表一个私有实体自行托管其Gitlab实例的URL。例如 gitlab.cnn.com 或 gitlab.facebook.com 或 gitlab.mycompany.com 等。 - Frak
哦,谢谢。在我们公司,私有仓库就像https://gitlab.com/parsiqio/portal/monitoring一样,但我猜这个解决方案也适用于自托管的子域名...虽然为了严谨起见,它们不一定以“gitlab.”开头 =P - Klesun

2
如果您需要在CI运行中执行此操作,并且您的私有存储库位于同一服务器上,则应该能够使用git子模块同时克隆其他存储库。自GitLab 8.12以来,使用${CI_JOB_TOKEN}是另一个选项。请参考git子模块依赖存储库了解更多信息。请注意,保留HTML标记。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接