Có một hệ thống kiểm soát phiên bản có thể hiển thị các thay đổi đối với một phương thức hoặc chức năng cụ thể không? [đóng cửa]


11

Đôi khi thật tuyệt khi có thể nói điều gì đó như:

(git|svn|hg|etc) diff Foo.c:main
(git|svn|hg|etc) log log Foo.c:main

để xem các thay đổi được thực hiện cho một chức năng cụ thể trong tệp nguồn kể từ lần xác nhận cuối cùng hoặc lịch sử thay đổi hoàn chỉnh. Câu hỏi của tôi là hai lần:

  1. Có một cái gì đó tồn tại mà làm điều này?
  2. Một công cụ như vậy sẽ được thực tế? Nó sẽ phải thực hiện một số phân tích mã đơn giản cho mỗi lần sửa đổi để so sánh các phiên bản khác nhau của hàm; chi phí quá cao để nó có hiệu quả?

7
Nhu cầu về điều này có vẻ như là một triệu chứng của một vấn đề tiềm ẩn, như các phương thức quá lớn hoặc các lớp không được tổ chức đúng cách, vì bất kỳ VCS nào có giá trị muối của nó sẽ cung cấp cho bạn một lớp khác và đủ dễ dàng để cuộn xuống để (hoặc tìm kiếm) phương thức được đề cập nếu lớp không quá lớn và bạn có thể thấy mã trong phương thức trong ngữ cảnh của cả lớp. Tóm lại, tôi nghĩ rằng giải pháp phương pháp là quá cụ thể.
Robert Harvey

@Robert đó là một điểm tốt, và tôi nghĩ rằng động lực của tôi để tự hỏi một phần là do ít nhất một chút phình mã. Tôi đã tìm ra một lỗi cho một phương thức cụ thể và muốn có thể xem nhật ký các thay đổi của phương thức đó để xem nó bị
hỏng

4
Đối với trường hợp rất hiếm khi điều này hữu ích, tính năng Đổ lỗi của TortoiseXXX khá mạnh mẽ. Bạn có thể thấy khi các thay đổi cuối cùng được thực hiện cho tất cả các dòng trong phương thức và, bằng cách sử dụng lề phải, tiếp tục lùi lại các thay đổi đó.
pdr

Câu trả lời:


14
  1. Theo tôi biết, nó không. Người ta có thể, nhưng tôi không mong đợi nó sẽ có chất lượng sản xuất nếu có.
  2. Tôi không nghĩ nó thực tế, nhưng không phải vì lý do bạn liệt kê. Nó không thực tế vì VCS sẽ phải có ngôn ngữ để hỗ trợ loại chức năng đó. Về cơ bản, bạn sẽ cần phải nhúng một cái gì đó để phân tích văn bản ngôn ngữ (một trong những bước lớn mà trình biên dịch thực hiện). Điều này làm tăng thêm rất nhiều trọng lượng cho VCS của bạn, hiện đang thực hiện một công việc khá phức tạp.
    Nhưng quan trọng hơn, bạn sẽ cần phải làm điều tương tự cho mọi ngôn ngữ bạn muốn hỗ trợ. Một điểm bán hàng của VCS chỉ hoạt động trên mã C sẽ không có nhiều lực kéo. Ngay cả khi bạn bỏ qua tất cả các ngôn ngữ tối nghĩa, nó sẽ là một cam kết lớn để hỗ trợ ngay cả 10 ngôn ngữ hàng đầu.

Và như Robert đã chỉ ra, việc có thể ngay lập tức nhảy sang một phương thức không phải là một lợi ích to lớn khi phải tự chuyển sang phương thức trong công cụ tìm khác biệt.


4
Tôi đứng thứ hai về điểm phụ thuộc ngôn ngữ và có rất nhiều mã dự phòng
Chander Shivdasani

1
Lập luận tương tự có thể được đưa ra đối với các trình soạn thảo làm nổi bật mã; họ phải nhận thức được ngôn ngữ và thực sự tồn tại. Có lẽ mức chi trả cao hơn một chút (màn hình đầy màu sắc của codez!). Tôi đồng ý phân tích cú pháp có lẽ sẽ là phần khó nhất. Mặc dù vậy, sẽ không khó để hỗ trợ các ngôn ngữ phổ biến nhất, đặc biệt là vì bạn không cần phải phân tích đầy đủ chương trình.
jches

8

svn thực sự làm một cái gì đó gần với những gì bạn muốn.

Bạn có thể sử dụng lệnh:

svn diff -x -p program.c 

Tên hàm -x -p cung cấp 'C' trên đầu tập thay đổi. trông như thế này

@@ -97,6 +102,8 @@ int function1(int *x)

Nó không lọc nhưng bạn có thể grep / search để phục vụ mục đích của mình chặt chẽ.

Tôi đoán điều này chỉ dành cho 'C' (hoặc C / C ++). Tuy nhiên, tôi đoán, nếu có nhu cầu, svn cũng sẽ cung cấp cho các ngôn ngữ khác.

Tôi không hoàn toàn đăng ký với lập luận rằng VCS KHÔNG nên làm điều đó. Sau tất cả, chúng tôi muốn tất cả các IDE hoặc trình soạn thảo (như VIM, EMACS) thực hiện tô sáng cú pháp cụ thể cho từng ngôn ngữ và hỗ trợ nhiều ngôn ngữ cùng một lúc. Vì vậy, VCS là một công cụ phát triển, cũng nên hỗ trợ chức năng đó.

Tất nhiên, nhờ câu hỏi của bạn mà tôi phát hiện ra nó. Tôi chưa bao giờ sử dụng nó trước đây.


1

Không đi sâu vào chi tiết cụ thể, ... nhưng bạn có thể kiểm tra trang web Semantic Design và phạm vi sản phẩm của họ. Họ cung cấp một số công cụ nhạy cảm với ngôn ngữ , có thể nói, thiếu một thuật ngữ tốt hơn.



-1

Để hiển thị bản sửa đổi và tác giả đã sửa đổi lần cuối mỗi dòng của tệp:

git blame filename

1
Đúng, nhưng Q yêu cầu một cách để tìm kiếm các thay đổi đối với một phương thức cụ thể trong một tệp. Hãy tưởng tượng rằng có 100 bản sửa đổi cho một tệp nhất định và trong số những bản bạn cần tìm những bản có thay đổi cho một chức năng cụ thể.
Caleb

Kiểm soát phiên bản không biết về chi tiết cú pháp và cũng không quan tâm đến các loại tệp.
Ghita

-1

ENVYStORE đều làm điều đó. Thật thú vị khi, như với Monicello mà Logan Capaldo đã đề cập ở trên, những thứ này cũng dành cho Smalltalk.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.