Can';t使用gitpython创建/添加新分支到git repo

Can';t使用gitpython创建/添加新分支到git repo,python,windows,git,python-3.4,gitpython,Python,Windows,Git,Python 3.4,Gitpython,我一直在编写一些Python脚本,这些脚本利用gitpython库根据redmine实例中的问题自动创建本地分支。首先,我尝试创建一些本地回购协议,以模拟我预期的系统运行,但我在第一个障碍上失败了 这是我的测试用例的设置,它应该创建一个“远程”repo,然后将其克隆为本地repo,最后创建一个本地功能分支: def setUp(self): # Create a remote git repo to simulate the one gitlab maintains baseDi

我一直在编写一些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

结果证明@torek是正确的。添加和合并空文件解决了以下问题:

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

我同意torek的观点,这似乎是gitpython中的一个bug。Jon的soloution会起作用,但会在git回购协议中留下不必要的垃圾

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

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

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

mkdir empty_repo
cd empty_repo
git --init
git checkout master
上述代码行将显示错误:pathspec“master”与git已知的任何文件都不匹配。原因是没有用于创建新头的提交引用

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

因此,这个问题可以通过改变处理回购的顺序来解决

  • 创建或克隆空的回购协议到本地位置
  • 断言克隆的回购协议确实是新的、空的。(如果没有,您可以根据需要生成尽可能多的新头部参照)
  • 因为它是空的,所以您可以添加和提交任何您想要的文件
  • 从第一次提交创建一个新头

  • 我只是猜测,但这似乎是gitpython中的一个bug,它假设您从未在一个尚未出生的分支上(在本例中,
    HEAD
    包含一个分支名称,但分支名称还不存在,因此,
    HEAD
    无法解析为修订,只能解析为分支名称)。只有两种“正常”方法可以使回购进入这种状态:在初始创建时,当没有提交时,或者使用
    git checkout--orphan
    。您遇到了第一个问题。基本上,这是正确的答案,但您可以使用该步骤来提交您希望提交的任何实际文件,而不仅仅是提交一些随机文件和提交。然后从初始提交创建第一个分支(头)。
    mkdir empty_repo
    cd empty_repo
    git --init
    git checkout master