如何与远程分支进行拉取和推送
我正在尝试自动化一个更改流程,这个流程目前是手动将源代码推送到Git上。我想用GitPython来封装这段代码:
from git import *
# create the local repo
repo = Repo.init("/tmp/test/repo", bare=True)
assert repo.bare == True
# check status of active branch
repo.is_dirty()
# clone the remote repo
remote_repo = repo.clone("http://user:pass@git/repo.git")
# compile source code into repository
# ...
# track untracked files
repo.untracked_files
# commit changes locally
repo.commit("commit changes")
# push changes to master
remote_repo.push()
当我运行这个代码时,出现了以下错误:
追踪记录(最近的调用在最前面):
文件 "git_test2.py",第 33 行,
repo.commit("提交更改")
坏对象:636f6d6d6974206368616e676573
这个脚本能够拉取远程仓库的内容,但在提交时失败了。有没有更好的解决办法呢?
2 个回答
你不能直接对一个裸仓库进行提交。你只能对它进行推送或拉取。可以想象一下,如果你在本地操作,应该怎么做。试着克隆一个裸仓库,然后进行这些操作,你会发现它们是行不通的。
我对Python的Git绑定不是特别熟悉,但我想你需要克隆一个工作仓库,选择一个分支(可以不是主分支),然后进行你的工作,使用git add命令来添加你做的那些改动,最后再提交。
另外,repo.untracked_files只是列出那些未跟踪的文件,并不会把它们添加到版本控制中。
老实说,看起来你只是盲目地从https://pythonhosted.org/GitPython/0.3.1/tutorial.html复制粘贴过来的,而没有真正理解里面的内容。
你需要操作索引对象,例如
index = repo.index
for ( path, stage ), entry in index.entries.iteritems: pass
index.add(['SOMEFILE'])
new_commit = index.commit("YOUR COMMIT MESSAGE")
#do somethign with new commit
我找到的另一个例子
import git
repo = git.Repo( '/home/me/repodir' )
print repo.git.status()
# checkout and track a remote branch
print repo.git.checkout( 'origin/somebranch', b='somebranch' )
# add a file
print repo.git.add( 'somefile' )
# commit
print repo.git.commit( m='my commit message' )
# now we are one commit ahead
print repo.git.status()
# now push
你使用的一些功能可能不会按照你预期的方式工作。一般来说,Repo
方法并不等同于同名的 git
子命令。
Repo.commit
并不是用来 创建 一个新的提交,而是用来 获取 一个已经存在的提交。 由于在这个仓库中没有叫“commit changes”的提交,所以会出现错误。Repo.clone
会在仓库的目录结构中创建一个名为http:
的目录,里面是 这个 仓库的克隆,这可能并不是你想要的结果。
如果你想克隆一个远程仓库,可以用一行代码就能做到:
repo = Repo.clone_from("http://user:pass@git/repo.git", "/tmp/test/repo")
想了解更多关于如何使用 GitPython 的信息,可以查看 API 参考。