web-dev-qa-db-ja.com

StashまたはBitbucketのすべてのリポジトリのリストを抽出するにはどうすればよいですか?

Bitbucketのすべてのプロジェクトの下にあるすべてのリポジトリのリストを抽出する必要があります。同じためのREST APIはありますか?見つかりませんでした。

オンプレミスとクラウドの両方のBitbucketを持っています。

7
Jeel

Bitbucket Cloudの場合

それらのREST APIを使用して、サーバーにアクセスしてクエリを実行できます。

具体的には、 Atlassianが提供するこのドキュメントページ を使用して、リポジトリを一覧表示する方法を学ぶことができます。


Bitbucket Serverの場合

編集:受信した時点で Dan Bennettからのこのツイート 、BitbucketServer用のAPI /プラグインシステムがあり、おそらくあなたのニーズに応えることができることを学びました。ドキュメントの場合: ここを参照してください。

Edit2:見つかった この参照 解決策として役立つ可能性のある個人リポジトリのリスト。

AFAIKは、Bitbucket Serverインスタンスと対話する小さなAPIを自分で構築しない限り、解決策はありません。

Atlassian Documentationは示しています 現在設定されているすべてのリポジトリを一覧表示するには、git remote -vを実行できます。ただし、これは通常git remote -vの使用方法ではないため、私はこれについて疑問を持っています。 Atlassianがこの機能をBitbucketServerに組み込んでいるよりも、Atlassianのドキュメントが不明確である可能性が高いと思います。

4
Harmelodic

特定のスタッシュURLのすべてのプロジェクトとリポジトリのクローンを作成します

    #!/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://[email protected]/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
7
Jason LeMonier

この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
0
Br.Bill

私がこの問題を解決した方法は、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ファイルを解析することだけです。

0
Kishanlal Patel

結局、ビットバケットのオンプレミスインストールでこれを自分で行う必要がありましたが、上記のREST APIにアクセスできないようだったので、それをスクレイプする短いスクリプトを思いつきましたこの回避策には、インストールする必要がなく、Bitbucketサーバーにログインする以外に、依存関係、証明書、またはログインについて心配する必要がないという利点があります。これを次のように設定することもできます。スクリプトをurlencodeし、接頭辞javascript:を付ける場合はブックマークします。

これを使用するには:

  1. Bitbucketサーバーを開きますprojectページ。リポジトリのリストが表示されます。
  2. ブラウザのdevtools consoleを開きます。これは通常、F12またはctrl-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
  }
}));

結果は、リポジトリのURL、名前、およびクローンURLを含む配列を含むJSON文字列です。

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