无法使用gitpython创建/添加新分支到git仓库

时间:2016-04-11 09:45:42

标签: python windows git python-3.4 gitpython

我一直在研究一些Python脚本,这些脚本利用gitpython库根据redmine实例中的问题自动创建本地分支。为了开始,我尝试创建一些本地回购来模拟系统,因为我希望它能够正常工作,但是我在第一道障碍中摔倒了。

这是我的测试用例的设置,应该创建一个' remote' 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

但是当我跑步时,我得到了:

Traceback (most recent call last):
  File "C:\Projects\PyTools\Gitted\test_Helpers.py", line 70, in setUp
    gitlabRepo.create_head('some-feature')
  File "C:\Python34\lib\site-packages\git\repo\base.py", line 330, in create_head
    return Head.create(self, path, commit, force, logmsg)
  File "C:\Python34\lib\site-packages\git\refs\symbolic.py", line 527, in create
    return cls._create(repo, path, cls._resolve_ref_on_create, reference, force, logmsg)
  File "C:\Python34\lib\site-packages\git\refs\symbolic.py", line 479, in _create
    target = repo.rev_parse(str(reference))
  File "C:\Python34\lib\site-packages\git\repo\fun.py", line 311, in rev_parse
    obj = name_to_object(repo, rev)
  File "C:\Python34\lib\site-packages\git\repo\fun.py", line 124, in name_to_object
    raise BadName(name)
gitdb.exc.BadName: Ref 'HEAD' did not resolve to an object

3 个答案:

答案 0 :(得分:1)

原来@torek是正确的。添加和编写空文件解决了这个问题:

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

答案 1 :(得分:0)

我同意torek,这似乎是gitpython中的一个错误。 Jon的解决方案可行,但它会在git repo中留下不必要的垃圾。

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

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

答案 2 :(得分:0)

看起来这是设计的,因为当你克隆一个空的repo时没有提交,因此没有HEAD引用,所以为了创建一个ref提交。你需要先提交一些东西。使用git命令行时,您将遇到类似的问题。

mkdir empty_repo
cd empty_repo
git --init
git checkout master

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

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

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

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