概述GitPython:我如何在GitPython的提交中访问文件的内容
我是gitpython的新手,我试图在提交中获取文件的内容。 我能够从特定的提交中获取每个文件,但每次运行该命令时都会收到错误消息。 现在,我知道该文件存在于gitpython中,但每次运行我的程序时,都会收到以下错误消息:
returned non-zero exit status 1
我正在使用Python 2.7.6和Ubuntu linux 14.04。
我知道该文件存在,因为我也直接从命令行进入git,检查相应的提交,search文件,并find它。 我也运行cat命令,并显示文件内容。 很多时候,错误出现时,它说,有问题的文件不存在。 我正在尝试使用gitpython进行每次提交,从每个单独的提交中获取每个blob或文件,并对该文件的内容运行外部Java程序。 Java程序旨在将一个string返回给Python。 为了捕获从我的Java代码返回的string,我也使用subprocess.check_output 。 任何帮助将不胜感激。
我尝试通过命令作为一个列表:
不能使用gitpython创build/添加一个新的分支到一个git仓库
gitpython错误时检查回购是肮脏的
如何在使用gitpython之后在windows上删除临时目录?
cmd = [\’java\’,\’-classpath\’,\’/home/rahkeemg/workspace/CSCI499_Java/bin/:/usr/local/lib/*:\’,\’java_gram.mainJava\’,\’absolute/path/to/file\’] subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=False)
而且我也试过把命令作为string传递:
subprocess.check_output(\’java -classpath /home/rahkeemg/workspace/CSCI499_Java/bin/:/usr/local/lib/*: java_gram.mainJava {file}\’.format(file=entry.abspath.strip()),shell=True)
有没有可能从gitpython访问文件的内容? 例如,说有一个提交,它有一个文件foo.java在该文件中是以下几行代码:
foo.java
import java.io.fileinputStream; import java.io.inputStream; import java.util.ArrayList; import java.util.List; public class foo{ public static voID main(String[] args) throws Exception{} }
我想访问文件中的所有内容并在其上运行外部程序。 任何帮助将不胜感激。 以下是我正在使用的一段代码
#! usr/bin/env python __author__ = \’rahkeemg\’ from git import * import git,Json,subprocess,re git_dir = \’/home/rahkeemg/documents/GitRepositorIEs/WhereHows\’ # make an instance of the repository from specifIEd path repo = Repo(path=git_dir) heads = repo.heads # obtain the differnet repositorIEs master = heads.master # get the master repository print master # get all of the commits on the master branch commits = List(repo.iter_commits(master)) cmd = [\’java\’,\’java_gram.mainJava\’] # start at the very 1st commit,or start at commit 0 for i in range(len(commits) – 1,-1): commit = commits[i] commit_num = len(commits) – 1 – i print commit_num,\”: \”,commit.hexsha,\’n\’,commit.message,\’n\’ for entry in commit.tree.traverse(): if re.search(r\’.java\’,entry.path): current_file = str(entry.abspath.strip()) #add the current file,or blob,to the List for the command to run cmd.append(current_file) print entry.abspath try: #This is scenario where I pass arguments into command as a string print subprocess.check_output(\’java -classpath /home/rahkeemg/workspace/CSCI499_Java/bin/:/usr/local/lib/*: java_gram.mainJava {file}\’.format(file=entry.abspath.strip()),shell=True) # scenario where I pass arguments into command as a List j_response = subprocess.check_output(cmd,shell=False) except subprocess.CalledProcessError as e: print \”Error on file: \”,current_file #Use pop on List to remove the last string,which is the selected file at the moment,to make place for the next file. cmd.pop()
首先,当你像这样遍历提交历史记录时,文件将不会被检出。 所有你得到的是文件名,也许导致文件或可能不是,但肯定不会导致文件从不同的修订版比当前签出。
但是,这是一个解决方案。 请记住,原则上,任何你可以用一些git命令做什么,你可以用gitpython做。
要从特定版本获取文件内容,您可以执行以下 *** 作,这是我从该页面获取的 :
git show <treeish>:<file>
因此,在gitpython中:
file_contents = repo.git.show(\'{}:{}\’.format(commit.hexsha,entry.path))
但是,这仍然不会使该文件出现在磁盘上。 如果你需要一些真正的文件路径,你可以使用tempfile :
f = tempfile.namedTemporaryfile(delete=False) f.write(file_contents) f.close() # at this point file with name f.name contains contents of # the file from path entry.path at revision commit.hexsha # your program launch goes here,use f.name as filename to be read os.unlink(f.name) # delete the temp file
总结
以上是内存溢出为你收集整理的GitPython:我如何在GitPython的提交中访问文件的内容全部内容,希望文章能够帮你解决GitPython:我如何在GitPython的提交中访问文件的内容所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
请登录后查看评论内容