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

2023-11-25

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

 returned non-zero exit status 1

我在用Python 2.7.6 and Ubuntu 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()

首先,当你像这样遍历提交历史记录时,文件不会被签出。您得到的只是文件名,可能会导致该文件,也可能不会,但它肯定不会导致该文件的版本与当前签出的版本不同。

不过,有一个解决方案。请记住,原则上,您可以用某些东西做任何事情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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GitPython:如何在 GitPython 中访问提交中的文件内容 的相关文章

随机推荐

  • 现代 n 层 ASP.NET Web 应用程序示例?

    所以我的 asp net 非常非常生锈 我正在尝试回到最佳实践以及其他什么 因此 我快速搜索谷歌并开始寻找示例 示例和教程 但我找到了什么 甚至在石器时代 最新 技术发布之前就已经写了一些陈旧的硬壳东西 当然 这些概念可能仍然有效 但实际执
  • 以 UTC 存储时间总是一个好主意,还是在这种情况下以本地时间存储更好?

    一般来说 最好的做法是用 UTC 存储时间 如中所述here and here 假设有一个重复发生的事件 假设结束时间始终为同一当地时间 假设为 17 00 无论该时区是否启用夏令时 并且还要求在特定时区的 DST 打开或关闭时不要手动更改
  • 在 Android 中调整位图大小

    我使用以下代码调整位图的大小 FileOutputStream out new FileOutputStream sdcard mods png Bitmap bmp Bitmap createScaledBitmap pict int p
  • 将数字限制在某个范围内 (Haskell)

    我公开了一个带有两个参数的函数 一个是最小界限 另一个是最大界限 例如 如何使用类型确保最小界限不大于最大界限 我想避免创建一个智能构造函数并返回 Maybe 因为它会使整个使用更加麻烦 谢谢 这并不能完全回答你的问题 但有时有效的一种方法
  • AWS Cognito - 用户池联合与身份池联合

    Question 为什么 AWS Cognito 有两个位置来联合身份提供商 我认为身份池应该与身份提供商联合 并且想知道为什么用户池也可以 请说明为什么有两个地点的原因 Cognito Identity Pool can federate
  • 清除__m128i的高字节

    我该如何清除16 ia 的高字节 m128i 我已经尝试过这个 它有效 但我想知道是否有更好 更短 更快 的方法 int i 0 lt i lt 16 m128i x m128i mask mm set epi8 0 i gt 14 1 0
  • 如何在 Express js 中使用 cookie 重定向到不同的域

    我正在 Node 上使用 Express 开发一个 Web 应用程序 我正在尝试实现代理登录功能 用户在登录我的网站后直接登录并重定向到另一个网站 在我的路由函数中 我编写了以下代码 res cookie fanws 值 res 重定向 h
  • Hyperv 似乎没有安装

    Hyper V 已启动 操作系统 Windows 10 专业版 内存 4GB Power shell 在管理模式下启动 我已经创建了一个虚拟交换机管理器 然后我正在尝试以下命令 minikube start vm driver hyperv
  • Flutter:让应用程序在后台运行的跨平台方式

    我正在尝试找出一种方法来保持 Flutter 应用程序运行 即使它没有处于焦点状态 例如 无论前台正在运行什么 都可以运行倒计时并在完成时播放警报声 显示通知 有人能指出我正确的方向吗 理想情况下 可以跨平台工作 我找到了这个thread但
  • PHP SimpleXML 换行

    我使用 PHP 的简单 XML 创建了一个 XML 文件 并保存了该文件 使用 fopen 在 php 中打开文件并打印内容时 我的 XML 如下所示 见下文
  • 让 CIColorCube 滤镜在 Swift 中工作

    我正在尝试让 CIColorCube 过滤器正常工作 然而 苹果文档仅提供了一个解释不清的参考示例 Allocate memory const unsigned int size 64 float cubeData float malloc
  • Java 中的 HMAC SHA1 签名

    我正在尝试与 TransUnion Web 服务交互 并且需要提供 HMAC SHA1 签名才能访问它 此示例位于 TransUnion 文档中 输入SampleIntegrationOwner2008 11 18T19 14 40 293
  • 创建窗口表面失败:EGL_BAD_MATCH?

    Android 版本是 2 2 1 设备是三星 Galaxy II 完整的崩溃日志是 java lang RuntimeException createWindowSurface failed EGL BAD MATCH at androi
  • 如何在 JavaScript 中从字符串中提取数字?

    我有一个 JavaScript 字符串 例如 box2 我只想2从中 I tried var thestring this attr href var thenum thestring replace w d w i 2 alert the
  • Facebook 如何为画布页面上的 iFrame 设置跨域 cookie?

    我正在浏览 Facebook 的文档 阅读有关画布应用程序的内容 并发现了一个示例应用程序 http developers facebook com docs samples canvas 然而 当我阅读他们的示例时 我对他们在 ifram
  • Laravel DB Seeds - 测试数据与示例数据

    我可能误解了它的工作原理 但是实现此目的的最佳方法是什么 我有一些想法 但看起来很老套 我有一组示例数据 用于测试我的应用程序 这是通过 Laravel 中内置的播种器播种的 其中包含示例用户 地址 文档等内容 我还有一组应该投入生产的默认
  • 在“启动项目”期间发生内部错误。 java.lang.NullPointerException

    我的 Android 项目编译得很好 但突然停止启动 然后我尝试从项目资源管理器启动其他项目 所有项目都抛出相同的异常 An internal error occurred during Launching Project java lan
  • 哪些 HTML 标签可以与 onClick 一起使用?

    哪些 HTML 标签可以有onclick事件和哪个不能 如果有我无法包含的标签onclick我想知道为什么不活动 onclick func 有什么规则是你应该遵守的吗 所有 HTML 元素都可以有一个onclick属性 See HTML 5
  • 如何更改 vim 中 :next 和 :previous 的顺序?

    在 vim 中 我在缓冲区中打开 3 个文件 A B C 按此顺序 我要返回缓冲区 B 在 B 中打开缓冲区 D e d 所以现在我在 D 中 但是当我使用 bprevious 时 我会转到 C 但我想转到上次访问的缓冲区 B 是否可以更改
  • GitPython:如何在 GitPython 中访问提交中的文件内容

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