gpt4 book ai didi

python-2.7 - GitPython:如何在 GitPython 的提交中访问文件的内容

转载 作者:IT王子 更新时间:2023-10-29 01:11:20 25 4
gpt4 key购买 nike

我是 GitPython 的新手,我想在提交中获取文件的内容。我能够从特定的提交中获取每个文件,但每次运行命令时都会出现错误。现在,我知道该文件存在于 GitPython 中,但每次运行我的程序时,我都会收到以下错误:

 returned non-zero exit status 1

我正在使用 Python 2.7.6Ubuntu Linux 14.04。

我知道文件存在,因为我也直接从命令行进入 Git,检查相应的提交,搜索文件,然后找到它。我还对其运行了 cat 命令,并显示了文件内容。多次出现错误时,它表示有问题的文件不存在。我试图通过 GitPython 完成每个提交,从每个单独的提交中获取每个 blob 或文件,并在该文件的内容上运行外部 Java 程序。 Java 程序旨在将字符串返回给 Python。为了捕获从我的 Java 代码返回的字符串,我还使用了 subprocess.check_output。任何帮助将不胜感激。

我尝试将命令作为列表传递:

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)

而且我还尝试将命令作为字符串传递:

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 different 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', '-classpath', '/home/rahkeemg/workspace/CSCI499_Java/bin/:/usr/local/lib/*:', 'java_gram.mainJava']

# start at the very 1st commit, or start at commit 0
for i in range(len(commits) - 1, 0, -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 the 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, stderr=subprocess.STDOUT, 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()

最佳答案

首先,当你像这样遍历提交历史时,文件不会被 check out 。您得到的只是文件名,可能指向文件,也可能不指向文件,但肯定不会指向与当前 check out 版本不同的文件。

但是,有一个解决方案。请记住,原则上,任何您可以使用 git 命令执行的操作,您都可以使用 GitPython 执行。

要从特定版本获取文件内容,您可以执行以下操作,I've taken from that page :

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

关于python-2.7 - GitPython:如何在 GitPython 的提交中访问文件的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36429482/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com