2013-04-17 44 views
10

Nó được trả lời trên trang web này rằng sự khác biệt của Bram Cohen được tìm thấy trong thị trường như là sự khác biệt mặc định và là một tùy chọn với git diff, nhưng tôi cảm thấy khó khăn khi nguồn chương trình độc lập độc lập thực hiện thuật toán khác biệt này.Tôi có thể tìm thấy khác biệt về sự kiên nhẫn ở đâu?

Ví dụ tôi muốn áp dụng sự kiên nhẫn diff để Perforce diffs, và nó khá rõ ràng với kinh điển "frobnitz" mã ví dụ cách kiên nhẫn diff là tốt hơn:

enter image description here

Các thiết bị đầu cuối bên phải đã gọi số git diff với cờ --patience.

Tôi cũng đã thiết lập tập lệnh perl diff-highlight, công việc của nó là đảo ngược màu sắc trên các đường khớp nối giữa phần đầu tiên và cuối cùng của các dòng này. Phía bên trái có một ví dụ mà điều này không hoàn toàn giúp đỡ nhiều lắm nhưng tôi sẽ để nó trượt vì ít nhất có dấu chấm phẩy đó ... Dù sao, việc cải thiện tập lệnh đánh dấu diff không phải là chủ đề của câu hỏi này.

Ngoài câu hỏi tìm nơi tìm sự khác biệt độc lập, nếu có ai biết cách thực hiện một lực lượng p4 sử dụng chương trình khác biệt bên ngoài, đó cũng là điều cần làm.

+0

gì, tôi sử dụng git để chạy nó trên hai tập tin? điều đó có vẻ xấu. Nó không bao giờ xảy ra với tôi. Tôi thấy rằng điều này hoạt động khá tốt, và tôi chắc chắn sẽ sử dụng nó. Nhưng nhiều hệ thống không được cài đặt git ... –

Trả lời

8

Nó có lẽ không lý tưởng như tôi muốn, nhưng giải pháp là hoàn toàn tốt từ góc độ thực tế (và đó là một quan điểm tốt chết tiệt để có).

git diff --no-index --patience file1 file2 thực hiện công việc. (thanks @StevenPenny)

$P4DIFF biến xác định sự khác biệt bên ngoài ... chúng tôi chỉ nhồi nhét git diff --patience --no-index vào đó.

4

Tôi lấy quyền tự do chuyển sự kiên nhẫn cho một số somewhat standalone library, trong C#. Nó vẫn còn sớm cho thư viện. Nó chủ yếu là một cổng từng dòng; vì vậy hy vọng nó có phần lớn sự ổn định của Python.

Hãy nhớ rằng patience chỉ tìm thấy các chuỗi dài nhất phổ biến (trong các cụm từ khác có nghĩa là các phần của tệp không thay đổi). Bạn sẽ cần phải determine the additions and removals yourself.

Cũng nên nhớ rằng trong kho Bazaar cũng có triển khai bằng Python và C (một lần nữa, việc triển khai chỉ giải quyết vấn đề LCS):

  • C version: dường như đánh giá hiệu suất trên rõ ràng, bạn thắng' t có thể dễ dàng hiểu thuật toán bằng cách đọc này. Ngoài ra còn có rất nhiều code-overhead cho Python interop.
  • Python version: việc triển khai tham chiếu của thuật toán. Dường như phần lớn giá trị rõ ràng hơn hiệu suất.

Nếu bạn cần viết triển khai của riêng mình, tôi khuyên bạn nên chuyển phiên bản Python trước, sau đó xem triển khai C để biết các mẹo về cách tăng tốc.

Cũng cần có triển khai trong kho Git, nhưng tôi chưa tìm kiếm.

+0

Tôi đã chuyển sang thực hiện khác biệt từng ký tự trong C++ được tìm thấy [ở đây] (http://code.google.com/p/google-diff- phù hợp với bản vá/vấn đề/chi tiết? id = 25), cùng với nhiều (utf8 và nhị phân liên quan) cải tiến của riêng tôi. Tôi đã gọi nó là 'sift'. Hy vọng rằng một ngày nào đó nó sẽ được tiết lộ cho thế giới. Cảm ơn bạn đã chia sẻ phiên bản của mình! (Tôi có thể thực sự thất bại w.r.t. làm một sự kiên nhẫn thực sự-diff, mặc dù nó hoạt động tốt trên ví dụ frobnitz) –

+0

@ StevenLu niềm vui, vui mừng bạn đã đúng. Tôi sẽ được quan tâm để nghe về những gì các hiệu ứng là một số cải tiến bạn đã thực hiện (nếu bạn mở ra các vấn đề về dự án GitHub). –

+0

Tôi thực sự vừa phát hiện ra điều này: https://github.com/leutloff/diff-match-patch-cpp-stl Bây giờ những gì tôi đã có được dựa trên phiên bản cũ hơn một chút dựa trên 'wstring' và tôi đã không thể đúng chuyển đổi nó để sử dụng 'chuỗi'. Tuy nhiên, tôi không coi đó là một hạn chế vì nó hỗ trợ hoàn toàn utf-8 (và tôi không chắc chắn cách triển khai 'string' không rộng có thể xử lý utf8 theo cách nhận thức được các điểm mã). –

3

Việc triển khai Python của chính Cohen chỉ cần các chỉnh sửa nhỏ (bên dưới) để chạy độc lập.Đó là trong hai tập tin, bản sao mà tôi vướng bởi googling "kiên nhẫn difflib":

http://stuff.mit.edu/afs/athena/system/i386_deb50/os/usr/share/pyshared/bzrlib/patiencediff.pyhttp://stuff.mit.edu/afs/athena/system/i386_deb50/os/usr/share/pyshared/bzrlib/_patiencediff_py.py

Các tập tin đầu tiên có thể được chạy từ dòng lệnh xấp xỉ như diff. Thứ hai là việc triển khai Python của các vòng bên trong. (Tập tin duy nhất ?? Tập thể dục cho người đọc!) Trong bzrlib cũng có một C thực hiện các vòng bên trong.

đây (với sự giúp đỡ của chương trình riêng của mình) đều được các bản vá lỗi của tôi để làm cho họ chạy độc lập:

Sandy$ patiencediff.py --patience orig/patiencediff.py patiencediff.py 
--- orig/patiencediff.py 
+++ patiencediff.py 
@@ -15,14 +15,20 @@ 
# along with this program; if not, write to the Free Software 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 

+try: 
+ from bzrlib.lazy_import import lazy_import 
+ lazy_import(globals(), """ 
+ import os 
+ import sys 
+ import time 
+ import difflib 
+ """) 
+except: 
+ import os 
+ import sys 
+ import time 
+ import difflib 

-from bzrlib.lazy_import import lazy_import 
-lazy_import(globals(), """ 
-import os 
-import sys 
-import time 
-import difflib 
-""") 


__all__ = ['PatienceSequenceMatcher', 'unified_diff', 'unified_diff_files'] 
@@ -135,11 +141,18 @@ 
     PatienceSequenceMatcher_c as PatienceSequenceMatcher 
     ) 
except ImportError: 
- from bzrlib._patiencediff_py import (
-  unique_lcs_py as unique_lcs, 
-  recurse_matches_py as recurse_matches, 
-  PatienceSequenceMatcher_py as PatienceSequenceMatcher 
-  ) 
+ try: 
+  from bzrlib._patiencediff_py import (
+   unique_lcs_py as unique_lcs, 
+   recurse_matches_py as recurse_matches, 
+   PatienceSequenceMatcher_py as PatienceSequenceMatcher 
+   ) 
+ except ImportError: 
+  from _patiencediff_py import (
+   unique_lcs_py as unique_lcs, 
+   recurse_matches_py as recurse_matches, 
+   PatienceSequenceMatcher_py as PatienceSequenceMatcher 
+   ) 


def main(args): 
Sandy$ patiencediff.py --patience orig/_patiencediff_py.py _patiencediff_py.py 
--- orig/_patiencediff_py.py 
+++ _patiencediff_py.py 
@@ -15,11 +15,16 @@ 
# along with this program; if not, write to the Free Software 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 

- 
+from __future__ import print_function 
from bisect import bisect 
import difflib 

-from bzrlib.trace import mutter 
+try: 
+ from bzrlib.trace import mutter 
+except: 
+ import sys 
+ def mutter(msg): 
+  print (msg, file=sys.stderr) 


__all__ = ['PatienceSequenceMatcher', 'unified_diff', 'unified_diff_files'] 
Sandy$ 
+0

Điều này thật hoàn hảo - cảm ơn bạn! Tôi không thấy phiên bản độc lập được vá trên tiac hoặc GitHub - bạn đã đăng nó ở bất cứ đâu? Nếu không, tôi sẽ khi tôi có cơ hội :). – cxw

+0

Tôi vẫn chưa có bản sao của tệp được vá, nhưng tôi tin rằng bạn có thể áp dụng bản vá ở trên cho bản gốc bằng tiện ích "vá". – FutureNerd

+0

Và tôi đã bỏ lỡ một phần câu hỏi của bạn. Không, tôi chưa bao giờ kết hợp chúng thành một tệp. – FutureNerd