Apakah ada sistem kontrol versi yang dapat menunjukkan perubahan pada metode atau fungsi tertentu? [Tutup]

11

Terkadang akan menyenangkan untuk mengatakan sesuatu seperti:

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

untuk melihat perubahan yang dilakukan pada fungsi tertentu dalam file sumber sejak komit terakhir, atau riwayat lengkap perubahan. Pertanyaan saya ada dua:

  1. Apakah ada sesuatu yang melakukan ini?
  2. Apakah alat seperti itu praktis? Itu harus melakukan beberapa penguraian sederhana kode pada setiap revisi untuk membandingkan versi fungsi yang berbeda; Apakah overhead terlalu banyak untuk menjadi efisien?
Jches
sumber
7
Kebutuhan akan hal ini sepertinya merupakan gejala dari masalah mendasar, seperti metode yang terlalu besar atau kelas yang tidak diorganisir dengan baik, karena setiap VCS yang bernilai akan memberi Anda perbedaan kelas, dan cukup mudah untuk menggulir ke bawah untuk (atau mencari) metode yang dipermasalahkan jika kelasnya tidak terlalu besar, dan Anda bisa melihat kode dalam metode tersebut dalam konteks seluruh kelas. Singkatnya, saya pikir resolusi metode terlalu spesifik.
Robert Harvey
@ Robert itu adalah poin yang bagus, dan saya pikir motivasi saya untuk bertanya-tanya sebagian karena setidaknya kode kecil. Saya melacak bug ke metode tertentu dan ingin dapat melihat log perubahan hanya untuk metode itu untuk melihat di mana ia rusak, dan diff penuh bisa sedikit merepotkan untuk mencari jika Anda sedang terburu-buru :)
jches
4
Untuk kasus yang sangat langka saat ini bermanfaat, fitur Blame TortoiseXXX cukup kuat. Anda dapat melihat kapan perubahan terakhir dibuat untuk semua baris dalam metode dan, menggunakan margin kanan, terus melangkah kembali melalui perubahan itu.
pdr

Jawaban:

14
  1. Sejauh yang saya tahu, tidak. Orang mungkin, tetapi saya tidak akan mengharapkannya menjadi kualitas produksi jika itu terjadi.
  2. Saya tidak berpikir itu praktis, tetapi tidak untuk alasan yang Anda sebutkan. Ini tidak praktis karena VCS harus sadar bahasa untuk mendukung fungsi semacam itu. Pada dasarnya, Anda perlu menyematkan sesuatu untuk mem-parsing teks bahasa (salah satu langkah besar yang dilakukan kompiler). Ini menambah banyak bobot ekstra untuk Anda VCS, yang sudah melakukan pekerjaan yang cukup kompleks.
    Tetapi yang lebih penting, Anda perlu melakukan hal yang sama untuk setiap bahasa yang ingin Anda dukung. VCS yang nilai jualnya hanya bekerja pada kode C tidak akan mendapatkan banyak daya tarik. Bahkan jika Anda mengabaikan semua bahasa yang tidak jelas, itu akan menjadi upaya besar untuk mendukung bahkan 10 bahasa teratas.

Dan seperti yang ditunjukkan Robert, bisa langsung beralih ke metode bukanlah keuntungan besar karena harus secara manual melompat ke metode dalam alat diff.

unholysampler
sumber
4
Saya kedua titik ketergantungan bahasa dan memiliki banyak kode yang berlebihan
Chander Shivdasani
1
Argumen yang sama dapat dibuat terhadap editor kode yang menyoroti editor; mereka harus sadar bahasa, dan memang ada. Mungkin hasilnya sedikit lebih tinggi (layar penuh kodez!). Saya setuju parsing mungkin akan menjadi bagian tersulit. Tidak akan terlalu sulit untuk mendukung bahasa yang paling umum, terutama karena Anda tidak perlu menguraikan program sepenuhnya.
Jches
8

svn sebenarnya melakukan sesuatu yang dekat dengan apa yang Anda inginkan.

Anda dapat menggunakan perintah:

svn diff -x -p program.c 

The -x -p menyediakan 'C' nama fungsi di atas set perubahan. yang terlihat seperti ini.

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

Itu tidak menyaring tetapi Anda dapat grep / pencarian untuk melayani tujuan Anda dengan cermat.

Saya kira ini hanya untuk 'C' (atau C / C ++). Namun, saya kira, jika ada permintaan svn akan membuatnya tersedia untuk bahasa lain juga.

Saya tidak cukup berlangganan argumen bahwa VCS TIDAK boleh melakukan itu. Lagi pula kami ingin semua IDE atau editor (seperti VIM, EMACS) untuk melakukan penyorotan sintaksis yang khusus untuk setiap bahasa dan mendukung banyak secara bersamaan. Jadi VCS menjadi alat pengembang, juga harus mendukung fungsi tersebut.

Tentu saja, terima kasih atas pertanyaan Anda bahwa saya menemukannya. Saya belum pernah menggunakannya sebelumnya.

Dipan Mehta
sumber
1

Tanpa membahas secara spesifik, ... tetapi Anda dapat memeriksa situs Desain Semantik dan berbagai produk mereka. Mereka menawarkan beberapa alat yang peka bahasa , sehingga bisa dikatakan, tidak memiliki istilah yang lebih baik.

Benteng
sumber
-1

Untuk menampilkan revisi dan penulis yang terakhir diubah setiap baris file:

git blame filename
Ghita
sumber
1
Benar, tetapi Q meminta cara untuk mencari perubahan pada metode tertentu dalam file. Bayangkan ada 100 revisi untuk file yang diberikan, dan dari yang Anda butuhkan untuk menemukan yang menyertakan perubahan pada fungsi tertentu.
Caleb
Kontrol versi tidak tahu tentang detail sintaks, dan juga tidak peduli jenis file.
Ghita
-1

ENVY dan STORE melakukan hal itu. Sangat menarik bahwa, seperti halnya Monicello yang disebutkan Logan Capaldo di atas, ini juga untuk Smalltalk.

stevek_mcc
sumber