/ / GitPython: Ako môžem získať prístup k obsahu súboru v potvrdení v GitPython - java, linux, python-2.7, gitpython

GitPython: Ako môžem získať prístup k obsahu súboru v komite GitPython - java, linux, python-2.7, gitpython

Som nový v GitPythone a snažím sa získaťobsah súboru v rámci potvrdenia. Dokážem získať každý súbor z konkrétneho potvrdenia, ale pri každom spustení príkazu sa zobrazuje chyba. Teraz viem, že súbor existuje v službe GitPython, ale pri každom spustení programu sa zobrazuje nasledujúca chyba:

 returned non-zero exit status 1

používam Python 2.7.6 a Ubuntu Linux 14.04.

Viem, že tento súbor existuje, pretože sa tiež dostávam priamo do gitu z príkazového riadku, pozrite sa na príslušné potvrdenie, vyhľadajte súbor a nájdite ho. Tiež som spustiť mačka príkaz a zobrazí sa obsah súboru. Keď sa chyba zobrazí mnohokrát, znamená to, že daný súbor neexistuje. Čo sa snažím urobiť, aby som prešiel každým potvrdením s programom GitPython, získal každý blob alebo súbor od každého jednotlivého potvrdenia a spustil externý program Java na obsah tohto súboru. Program Java je navrhnutý na vrátenie reťazca do Pythonu. Na zachytenie reťazca vráteného z môjho kódu Java tiež používam subprocess.check_output, Akákoľvek pomoc sa veľmi ocení.

Pokúsil som sa odovzdať príkaz ako zoznam:

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)

A tiež som sa pokúsil odovzdať príkaz ako reťazec:

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)

Je možné získať prístup k obsahu súboru z programu GitPython? Napríklad povedzme, že existuje potvrdenie a má jeden súbor foo.java V tomto súbore sú nasledujúce riadky kódu:

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{}
}

Chcem získať prístup ku všetkému v súbore a spustiť na ňom externý program. Akákoľvek pomoc by sa veľmi ocenila. Nižšie je časť kódu, ktorý používam na to

 #! 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", "-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 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()

odpovede:

6 pre odpoveď č. 1

Najprv, keď prejdete po potvrdeníhistória, ako je táto, nebude súbor odhlásený. Jediné, čo dostanete, je názov súboru, ktorý môže viesť k súboru alebo možno nie, ale určite to nepovedie k súboru z inej revízie, ako je momentálne odhlásená.

Existuje však riešenie. Pamätajte, že v zásade by ste s niektorými mohli robiť čokoľvek git príkaz, môžete urobiť s GitPython.

Ak chcete získať obsah súboru z konkrétnej revízie, môžete urobiť nasledujúce, ktoré Z tejto stránky som prevzal:

git show <treeish>:<file>

preto v GitPython:

file_contents = repo.git.show("{}:{}".format(commit.hexsha, entry.path))

To by však ešte neumožnilo, aby sa súbor objavil na disku. Ak potrebujete nejakú skutočnú cestu k súboru, môžete použiť 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