如何在Stash或Bitbucket中提取所有存储库的列表?

时间:2016-03-18 16:55:21

标签: rest repository bitbucket bitbucket-server

我需要在Bitbucket的所有项目中提取所有repos的列表。是否有相同的REST API?我找不到一个。

我有内部部署和云Bitbucket。

6 个答案:

答案 0 :(得分:7)

克隆所有项目&给定存储网址的存储库

    #!/usr/bin/python
    # 
    # @author Jason LeMonier
    #
    # Clone ALL Projects & Repositories for a given stash url
    #
    # Loop through all projects: [P1, P2, ...]
    #    P1 > for each project make a directory with the key "P1"
    #    Then clone every repository inside of directory P1
    #    Backup a directory, create P2, ... 
    # 
    # Added ACTION_FLAG bit so the same logic can run fetch --all on every repository and/or clone.

    import sys
    import os
    import stashy

    ACTION_FLAG = 1     # Bit: +1=Clone, +2=fetch --all 

    url  = os.environ["STASH_URL"]  # "https://mystash.com/stash"
    user = os.environ["STASH_USER"] # joedoe"
    pwd  = os.environ["STASH_PWD"]  # Yay123

    stash = stashy.connect(url, user, pwd)

    def mkdir(xdir):
        if not os.path.exists(xdir):
            os.makedirs(xdir)

    def run_cmd(cmd):
        print ("Directory cwd: %s "%(os.getcwd() ))
        print ("Running Command: \n    %s " %(cmd))
        os.system(cmd)

    start_dir = os.getcwd()

    for project in stash.projects:
        pk = project_key = project["key"]
        mkdir(pk) 
        os.chdir(pk)

        for repo in stash.projects[project_key].repos.list():
            for url in repo["links"]["clone"]:
                href = url["href"]
                repo_dir = href.split("/")[-1].split(".")[0]

                if (url["name"] == "http"):
                    print ("        url.href: %s"% href)  # https://joedoe@mystash.com/stash/scm/app/ae.git
                    print ("Directory cwd: %s Project: %s"%(os.getcwd(), pk))

                    if ACTION_FLAG & 1 > 0:
                        if not os.path.exists(repo_dir):
                            run_cmd("git clone %s" % url["href"])
                        else:
                            print ("Directory: %s/%s exists already.  Skipping clone. "%(os.getcwd(), repo_dir))

                    if ACTION_FLAG & 2 > 0:
                        # chdir into directory "ae" based on url of this repo, fetch, chdir back
                        cur_dir = os.getcwd()
                        os.chdir(repo_dir)
                        run_cmd("git fetch --all ")
                        os.chdir(cur_dir)

                    break

        os.chdir(start_dir) # avoiding ".." in case of incorrect git directories

答案 1 :(得分:4)

对于Bitbucket Cloud

您可以使用他们的REST API在您的服务器上访问和执行查询。

具体来说,您可以使用this documentation page, provided by Atlassian,了解如何列出您的存储库。

对于Bitbucket服务器

编辑:截至收到this tweet from Dan Bennett时,我已经了解到Bitbucket Server的API /插件系统可能可以满足您的需求。对于文档:See here.

Edit2:找到this reference列出可作为解决方案的个人存储库。

AFAIK没有为您提供解决方案,除非您为自己构建了一个与您的Bitbucket Server实例交互的API。

Atlassian Documentation does indicate要列出所有当前配置的存储库,您可以执行git remote -v。但是,我对此表示怀疑,因为通常不会使用git remote -v。我认为Atlassian的文档更可能不清楚,而不是Atlassian在Bitbucket Server的这个功能中构建。

答案 2 :(得分:0)

这个ruby脚本不是最出色的代码,这很有意义,因为我不是最出色的程序员。但是很明显,已经过测试,并且可以正常工作。

该脚本过滤Bitbucket API调用的输出,以创建有关Bitbucket服务器上所有存储库的完整报告。报告按项目排列,包括总计和小计,每个回购的链接以及回购是公开的还是个人的。我可以将其简化为一般用途,但它确实非常有用。

没有命令行参数。只需运行它即可。

#!/usr/bin/ruby
#
# @author Bill Cernansky
#
# List and count all repos on a Bitbucket server, arranged by project, to STDOUT.
#
require 'json'

bbserver   = 'http(s)://server.domain.com'
bbuser     = 'username'
bbpassword = 'password'
bbmaxrepos = 2000       # Increase if you have more than 2000 repos

reposRaw = JSON.parse(`curl -s -u '#{bbuser}':'#{bbpassword}' -X GET #{bbserver}/rest/api/1.0/repos?limit=#{bbmaxrepos}`)

projects = {}

repoCount = reposRaw['values'].count

reposRaw['values'].each do |r|
    projID = r['project']['key']
    if projects[projID].nil?
        projects[projID] = {}
        projects[projID]['name'] = r['project']['name']
        projects[projID]['repos'] = {}
    end
    repoName = r['name']
    projects[projID]['repos'][repoName] = r['links']['clone'][0]['href']
end

privateProjCount = projects.keys.grep(/^\~/).count
publicProjCount = projects.keys.count - privateProjCount

reportText = ''
privateRepoCount = 0
projects.keys.sort.each do |p|
    # Personal project slugs always start with tilde
    isPrivate = p[0] == '~'
    projRepoCount = projects[p]['repos'].keys.count
    privateRepoCount += projRepoCount if isPrivate
    reportText += "\nProject: #{p} : #{projects[p]['name']}\n  #{projRepoCount} #{isPrivate ? 'PERSONAL' : 'Public'} repositories\n"

    projects[p]['repos'].keys.each do |r|
        reportText += sprintf("    %-30s : %s\n", r, projects[p]['repos'][r])
    end
end

puts "BITBUCKET REPO REPORT\n\n"
puts sprintf("  Total Projects: %5d     Public: %5d    Personal: %5d", projects.keys.count, publicProjCount, privateProjCount)
puts sprintf("  Total Repos:    %5d     Public: %5d    Personal: %5d", repoCount, repoCount - privateRepoCount, privateRepoCount)
puts reportText

答案 3 :(得分:0)

我解决此问题的方法是获取html页面,并给它这样一个荒谬的限制。多数民众赞成在python:

 cmd = "curl -s  -k --user " +  username +  " https://URL/projects/<KEY_PROJECT_NAME>/?limit\=10000"

然后我用BeautifulSoup对其进行了解析

make_list = str((subprocess.check_output(cmd, shell=True)).rstrip().decode("utf-8"))
  html = make_list 
  parsed_html = BeautifulSoup(html,'html.parser')
list1 = [] 
  for a in parsed_html.find_all("a", href=re.compile("/<projects>/<KEY_PROJECT_NAME>/repos/")):
    list1.append(a.string)
print(list1)

要使用此功能,请确保您更改和,这应该是您要定位的bitbucket项目。所有,我正在做的是解析一个html文件。

答案 4 :(得分:0)

我最终不得不自己完成一个本地安装的Bitbucket安装,该安装似乎无法访问上面讨论的REST API,因此我想出了一个简短的脚本将其从网页中删除。这种解决方法的优点是,您无需安装任何东西,除了登录Bitbucket服务器之外,您无需担心依赖项,证书或登录名。如果您对脚本进行urlencode并以javascript:作为前缀,则还可以将其设置为书签。

要使用此功能:

  1. 打开您的Bitbucket服务器项目页面,您应该在其中看到存储库列表。
  2. 打开浏览器的 devtools控制台。通常是F12ctrl-shift-i
  3. 将以下内容粘贴到命令提示符中。
JSON.stringify(Array.from(document.querySelectorAll('[data-repository-id]')).map(aTag => {
  const href = aTag.getAttribute('href');
  let projName = href.match(/\/projects\/(.+)\/repos/)[1].toLowerCase();
  let repoName = href.match(/\/repos\/(.+)\/browse/)[1];
  repoName = repoName.replace(' ', '-');
  const templ = `https://${location.host}/scm/${projName}/${repoName}.git`;
  return {
    href,
    name: aTag.innerText,
    clone: templ
  }
}));

结果是一个JSON字符串,其中包含带有存储库URL,名称和克隆URL的数组。

[{
  "href": "/projects/FOO/repos/some-repo-here/browse",
  "name": "some-repo-here",
  "clone": "https://mybitbucket.company.com/scm/foo/some-repo-here.git"
}]

答案 5 :(得分:0)

  1. 登录后:在右上角,点击您的个人资料图片,然后点击“查看个人资料”

enter image description here

  1. 记下您的用户(在下面的示例中为“YourEmail@domain.com”,但请注意区分大小写)

enter image description here

  1. 点击个人资料图片 > 管理帐户 > 个人访问令牌 > 创建令牌(选择“读取”访问类型足以实现此功能)

对于所有项目中的所有存储库:

  1. 打开 CLI 并使用以下命令(记得填写您的服务器域!):
curl -u "YourEmail@domain.com" -X GET https://<my_server_domain>/rest/api/1.0/projects/?limit=1000
  1. 它会要求您提供个人访问令牌,您遵守并获得包含所有请求的存储库的 JSON 文件

对于给定项目中的所有存储库:

  1. 选择您想要从中获取存储库的项目。就我而言,项目 URL 是:/projects/TECH/,因此我的 {projectKey} 是“TECH”,下面的命令需要它。

  2. 打开一个 CLI 并使用这个命令(记得填写你的服务器域和 projectKey!):

curl -u "YourEmail@domain.com" -X GET https://<my_server_domain>/rest/api/1.0/projects/{projectKey}/repos?limit=50

最后的润色

  1. (可选)如果您只想要请求的存储库的标题并且安装了 jq(对于 Windows,下载 exe 并将其添加到 PATH 应该就足够了,但是您需要为此重新启动 CLI要检测的新添加),您可以使用以下命令:
curl -u $BBUSER -X GET <my_server_domain>/rest/api/1.0/projects/TECH/repos?limit=50 | jq '.values|.[]|.name'

(使用数据中心/Atlassian Bitbucket v7.9.0 和 powershell CLI 测试)