簡體   English   中英

Git - 重命名所有默認分支

[英]Git - Rename All Default Branches

我使用 Gitlab 進行源代碼控制。 Gitlab 最近切換到使用main作為新存儲庫的默認分支,如此處所述, 很好,我已經調整了我的開發環境以匹配。

我也想更改我現有的存儲庫。 本教程描述了一種方法來做到這一點,但涉及多個手動步驟,並且一次只能在一個存儲庫上工作,更不用說復制歷史記錄的步驟了。 由於我們的代碼庫由數百個存儲庫組成,因此這是不可行的。

有沒有辦法在 Gitlab 或 Gitbash 中自動執行此操作?

這只是從 master 創建一個名為main的新分支,刪除 master 分支,並調整默認/受保護分支規則的問題。 可以使用 GitLab API 執行這些操作,這將允許您編寫這些操作的腳本。

基本步驟和API參考資料:

  1. 使用創建分支 API從 master 創建main分支

  2. 使用編輯項目API設置默認分支為main

  3. 使用保護分支 API保護main

  4. (可選)使用unprotect 分支 API從 master 刪除保護和/或使用delete 分支 API刪除 master 分支。

當然,您必須具有足夠的權限才能在項目中執行所有這些操作。

最后,您還可以使用list projects API列出您的所有項目並遍歷結果以將其應用於所有項目——您可以for each project; do steps 1-4 for each project; do steps 1-4

使用python-gitlab,像這樣的腳本應該可以正確執行所有這些步驟:

import gitlab

gl = gitlab.Gitlab("https://gitlab.example.com", private_token="your token")

# add your project IDs here
all_projects = [gl.projects.get(1234), gl.projects.get(4567), ...]

# or list all projects programatically: (careful if using gitlab.com!)
# all_projects = list(gl.projects.list(as_list=False))


def get_or_create_main_branch(project):
    try:
        b = project.branches.get("main")
        print("main branch already exists")
        return b
    except gitlab.exceptions.GitlabError:
        print("Creating main branch from ref:", project.default_branch)
        project.branches.create({"branch": "main", "ref": project.default_branch})
        print("Creating protection rule for main branch")
        # Edit access levels per your needs
        project.protectedbranches.create(
            {
                "name": "main",
                "merge_access_level": gitlab.const.DEVELOPER_ACCESS,
                "push_access_level": gitlab.const.MAINTAINER_ACCESS,
            }
        )
        return project.branches.get("main")


def fix_project(project):
    main_branch = get_or_create_main_branch(project)
    print("setting default branch to main...", end="")
    old_default_branch = project.branches.get(project.default_branch)
    project.default_branch = "main"
    project.save()
    print("Done!")
    print("deleting original default branch", old_default_branch.name, "...", end="")
    old_default_branch.delete()
    print("done!")


for project in all_projects:
    print("-" * 20)
    print("Checking", project.path_with_namespace, "for default branch")
    if project.default_branch != "main":
        print(
            f'Default branch is "{project.default_branch}", not "main". Attempting Fix...'
        )

        try:
            fix_project(project)
        except gitlab.exceptions.GitlabError as e:
            # sometimes bare repos without any commits will error out
            print("FATAL. Failure getting or creating main branch", e)
            print("Skipping")
            continue  # move on to next project in the loop
        print("successfully fixed", project.path_with_namespace)
    else:
        print('Default branch is already "main", skipping')
        continue

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM