<p><strong>更新</strong>:<br/>
我发现我以前的答案已经不起作用了。以下是新的解决方案:<br/>
对于这个解决方案,您需要<a href="https://pypi.org/project/GitPython/" rel="nofollow noreferrer"> git </a>和{a2}包。在</p>
<pre class="lang-py prettyprint-override"><code>import git
from unidiff import PatchSet
from cStringIO import StringIO
commit_sha1 = 'commit_sha'
repo_directory_address = "your/repo/address"
repository = git.Repo(repo_directory_address)
commit = repository.commit(commit_sha1)
uni_diff_text = repository.git.diff(commit_sha1+ '~1', commit_sha1,
ignore_blank_lines=True,
ignore_space_at_eol=True)
patch_set = PatchSet(StringIO(uni_diff_text), encoding='utf-8')
change_list = [] # list of changes
# [(file_name, [row_number_of_deleted_line],
# [row_number_of_added_lines]), ... ]
for patched_file in patch_set:
file_path = patched_file.path # file name
print('file name :' + file_path)
del_line_no = [line.target_line_no
for hunk in patched_file for line in hunk
if line.is_added and
line.value.strip() != ''] # the row number of deleted lines
print('deleted lines : ' + str(del_line_no))
ad_line_no = [line.source_line_no for hunk in patched_file
for line in hunk if line.is_removed and
line.value.strip() != ''] # the row number of added liens
print('added lines : ' + str(ad_line_no))
change_list.append((file_path, del_line_no, ad_line_no))
</code></pre>
<hr/>
<p><strong>旧解决方案</strong>(此方案可能不再有效)</p>
<p>最后,我找到了解决办法。gitpython的输出与标准git diff输出略有不同。在标准的git diff源文件中,以<strong>-</strong>开头,但是gitpython的输出以<strong></strong>开头,正如您在运行以下python代码的输出中看到的那样(这个示例是用<a href="https://github.com/elastic/elasticsearch" rel="nofollow noreferrer">elasticsearch repository</a>)生成的:</p>
^{pr2}$
<p>部分输出如下:</p>
<pre><code>core/src/main/java/org/elasticsearch/action/index/IndexRequest.java
=======================================================
lhs: 100644 | f8b0ce6c13fd819a02b1df612adc929674749220
rhs: 100644 | b792241b56ce548e7dd12ac46068b0bcf4649195
a/core/src/main/java/org/elasticsearch/action/index/IndexRequest.java
+++ b/core/src/main/java/org/elasticsearch/action/index/IndexRequest.java
@@ -20,16 +20,18 @@
package org.elasticsearch.action.index;
import org.elasticsearch.ElasticsearchGenerationException;
+import org.elasticsearch.Version;
import org.elasticsearch.action.ActionRequestValidationException;
import org.elasticsearch.action.DocumentRequest;
import org.elasticsearch.action.RoutingMissingException;
import org.elasticsearch.action.TimestampParsingException;
import org.elasticsearch.action.support.replication.ReplicationRequest;
import org.elasticsearch.client.Requests;
+import org.elasticsearch.cluster.metadata.IndexMetaData;
import org.elasticsearch.cluster.metadata.MappingMetaData;
import org.elasticsearch.cluster.metadata.MetaData;
import org.elasticsearch.common.Nullable;
-import org.elasticsearch.common.UUIDs;
+import org.elasticsearch.common.Strings;
import org.elasticsearch.common.bytes.BytesArray;
import org.elasticsearch.common.bytes.BytesReference;
</code></pre>
<p>如您所见,源文件的第4行以<strong></strong>开头。要解决此问题,您需要编辑<a href="https://github.com/matiasb/python-unidiff" rel="nofollow noreferrer">unidiff 0.5.2</a>的源文件中的正则表达式,该文件位于<a href="https://github.com/matiasb/python-unidiff/blob/master/unidiff/constants.py" rel="nofollow noreferrer">/unidiff/constants.py</a>中:</p>
<pre><code>RE_SOURCE_FILENAME = re.compile(
r'^ - (?P<filename>[^\t\n]+)(?:\t(?P<timestamp>[^\n]+))?')
</code></pre>
<p>收件人:</p>
<pre><code>RE_SOURCE_FILENAME = re.compile(
r'^ (?P<filename>[^\t\n]+)(?:\t(?P<timestamp>[^\n]+))?')
</code></pre>
<p><strong>PS:</strong>如果源文件重命名,gitpython将生成diff start with<strong>-</strong>。但它不会抛出错误,因为我过滤了重命名文件的git diff(<strong>diff_filter='cr'</strong>)。在</p>