如何与远程分支进行拉取和推送

4 投票
2 回答
5513 浏览
提问于 2025-04-18 00:02

我正在尝试自动化一个更改流程,这个流程目前是手动将源代码推送到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 个回答

1

你不能直接对一个裸仓库进行提交。你只能对它进行推送或拉取。可以想象一下,如果你在本地操作,应该怎么做。试着克隆一个裸仓库,然后进行这些操作,你会发现它们是行不通的。

我对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
4

你使用的一些功能可能不会按照你预期的方式工作。一般来说,Repo 方法并不等同于同名的 git 子命令。

如果你想克隆一个远程仓库,可以用一行代码就能做到:

repo = Repo.clone_from("http://user:pass@git/repo.git", "/tmp/test/repo")

想了解更多关于如何使用 GitPython 的信息,可以查看 API 参考

撰写回答