无法使用gitpython在git存储库中创建/添加新分支

2024-10-02 12:38:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在研究一些Python脚本,它们利用gitpython库根据redmine实例中的问题自动创建本地分支。首先,我试图创建一些本地回购,以模拟系统,正如我预期的那样,但我遇到了第一个障碍。在

这是我的测试用例的设置,它应该创建一个“远程”repo,然后将其克隆为本地repo,最后创建一个本地功能分支:

def setUp(self):
    # Create a remote git repo to simulate the one gitlab maintains
    baseDir = os.path.join('C:\\', 'test-repos')
    if os.path.exists(baseDir):
        shutil.rmtree(baseDir)

    gitlabRepoLocation = os.path.join(baseDir, 'gitlab')
    gitlabRepo = git.Repo.init(gitlabRepoLocation)

    # Clone to a local repo
    localRepoLocation = os.path.join(baseDir, 'local')
    localRepo = git.Repo.clone_from("file://"+gitlabRepoLocation, localRepoLocation)
    localRepo.create_head('some-feature') # <-- This fails

但当我运行它时,我得到:

^{pr2}$

Tags: topathgit脚本oslocal分支gitlab
3条回答

看起来这是按设计的,因为克隆空repo时没有提交,因此也没有头引用,所以为了创建对提交的引用。你得先做点什么。使用git命令行时,您将遇到类似的问题。在

mkdir empty_repo
cd empty_repo
git  init
git checkout master

上面的代码行将显示错误error: pathspec 'master' did not match any file(s) known to git.这是因为没有用于创建新头部的提交引用。在

但是添加和提交一组文件之后,您将生成第一个md5引用和第一个HEAD对象。在

因此,可以通过更改回购的处理顺序来解决此问题。在

  1. 创建空的存储库或将其克隆到本地位置。在
  2. 断言克隆的回购确实是新的和空的。(如果没有,您可以根据需要生成尽可能多的新头部引用)
  3. 因为它是空的,你可以添加和提交任何你想要的文件。在
  4. 从第一次提交创建一个新的头。在

原来@torek是对的。添加并提交一个空文件解决了这个问题:

    filename = 'readme.txt'
    open(filename, 'wb').close()
    gitlabRepo.index.add([filename])
    gitlabRepo.index.commit("Adding "+filename+ "to repo")

我同意torek的观点,这似乎是gitpython中的一个bug。乔恩的解决方案会奏效,但它会在git回购中留下不必要的垃圾。在

我个人最终通过使用git命令行工具来创建分支来解决这个问题。在

command = ['git','branch','-f','workingbranch',parenttagname]                 
print(command, flush=True)
if (subprocess.call(command) != 0): exit(1)
branch = repo.heads.workingbranch

相关问题 更多 >

    热门问题