আমি কি 'গিট ডিফার' তৈরি করতে পারি কেবল লাইন নম্বর এবং পরিবর্তিত ফাইলের নাম?


276

এই প্রশ্নটি "লাইন নম্বর" জন্য কল করে, যদি আপনি আউটপুটে লাইন সংখ্যাগুলির যত্ন না করেন তবে এই প্রশ্নটি এবং উত্তরটি দেখুন


মূলত, আমি পরিবর্তিত সামগ্রী দেখতে চাই না, কেবল ফাইলের নাম এবং লাইন নম্বর।


আমি কৌতূহলী, কোড ছাড়া লাইন নম্বরগুলি কি সত্যই কার্যকর? অথবা আপনি কি লাইনের সংখ্যা পরিবর্তন করতে চান?
অ্যান্ড্রু মার্শাল

ভাল, বিশেষত নয়, তবে আমার কোডটি যেখানে পরিবর্তন হয়েছে সেখানে বুকমার্ক করা দরকার।
ওয়েই

1
এর একটি ব্যবহার হ'ল একটি কোড কভারেজ রিপোর্টের সাথে
তথ্যগুলি একত্রিত করা

@ অ্যান্টনিজি আমি এই প্রশ্নটি এমন একটি ইউটিলিটি তৈরি করার চেষ্টা করতে গিয়েছিলাম যা ঠিক একই জিনিসটি করে (কভারেজ বনাম পরিবর্তিত রেখাগুলি) তৈরি করে। আপনি কি রিপোর্ট তৈরির ব্যবস্থা করেছিলেন? যদি তা হয় তবে আপনি কোথাও প্রকাশ করেছেন?
অ্যান্ড্রু নিউডিগেট

@ অ্যান্ড্রু নিউডিগেট এটি একটি দুর্দান্ত সরঞ্জাম হতে পারে তবে আমি কখনও এটি তৈরি করি নি। আমি যখন এই প্রশ্নটি পেলাম তখন আমি অন্য কোনও ধরণের কোড কভারেজের ফলাফলের প্রক্রিয়াজাতকরণ করছিলাম, তবে আমার পরামর্শটি বাস্তবায়নের জন্য প্রয়োজনীয়
সময়টিকে

উত্তর:


70

নোট: আপনি করছেন মাত্র নাম খুঁজছেন (পরিবর্তিত ফাইল ছাড়া লাইন সংখ্যা লাইন জন্য যে পরিবর্তন করা হয়েছে), সহজে, অন্য উত্তর এখানে করতে এই লিঙ্কে ক্লিক


কোন বিল্ট-ইন এর এই জন্য বিকল্প (এবং আমি মনে করি না এটা সব পারেন দরকারী যে), কিন্তু এটা হয় একটি "বহিরাগত পরিবর্তন 'স্ক্রিপ্ট সাহায্যে Git মধ্যে এই কাজ করতে, সম্ভব।

এখানে একটি সুন্দর কৃপণ এক; আপনি যেভাবে আউটপুটটি পছন্দ করতে চান তা ঠিক করা আপনার উপর নির্ভর করবে।

#! /bin/sh
#
# run this with:
#    GIT_EXTERNAL_DIFF=<name of script> git diff ...
#
case $# in
1) "unmerged file $@, can't show you line numbers"; exit 1;;
7) ;;
*) echo "I don't know what to do, help!"; exit 1;;
esac

path=$1
old_file=$2
old_hex=$3
old_mode=$4
new_file=$5
new_hex=$6
new_mode=$7

printf '%s: ' $path
diff $old_file $new_file | grep -v '^[<>-]'

"বহিরাগত ডিফ" সম্পর্কিত বিবরণগুলির বিবরণ দেখুন GIT_EXTERNAL_DIFF মধ্যে Git ম্যানুয়েল পৃষ্ঠা (লাইন 700 চারপাশে, চমত্কার শেষ পাসে)।


1
ধন্যবাদ। আমি আসলে একটি অনুরূপ স্ক্রিপ্ট লিখেছি, এটির জন্য কোনও অভ্যন্তরীণ বিকল্প নেই বলে নিশ্চিত হওয়ার পরে, :)
ওয়েই

পাইপিং আপনাকে | grep -o '^[0-9]*'ডান হাতের দিকের যত্ন নেই বলে ধরে নিয়েই কেবল সংখ্যাগুলি দেয় gives
GKFX

1
@ ডিলান ইউং হ্যাঁ; প্রদর্শিত ফাইলগুলিকে সীমাবদ্ধ করতে, অংশটি --diff-filter=...যেখানে ...দেখতে চান সেই ধরণের পরিবর্তন করুন: Mসংশোধিত, Aযোগ করার Dজন্য, মোছার জন্য এবং git diffডকুমেন্টেশন অনুসারে অন্যদের জন্য the
টোকর

@ সেন্টিটিস: ওপি যা চেয়েছিল তা নয়, যেমন আমি আমার উত্তরের শীর্ষে নোট করি। তিনি একাই ফাইলের নাম চান না। তিনি লাইন নম্বর সহ নাম চান ।
টোরেক

পর্যাপ্ত পরিমাণে @ টোরেক :)
স্মৃতি দশক

831

খুব সহজ:

git diff --name-only

এগিয়ে যান এবং ভিন্ন!


88
এই পৃষ্ঠাটি দেখার সময় বেশিরভাগ লোকেরা যে উত্তরটি খুঁজছেন এটিই এটি সম্ভব (এটি আমার পক্ষে ছিল)। যাইহোক, এটি মূল প্রশ্নের উত্তর দেয় না, যা লাইন সংখ্যার উল্লেখ করে।
পিটার মুলার

12
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত নয় কারণ এটি কেবল অর্ধেক সমস্যা সমাধান করে - আপনার এখনও কোন লাইনগুলি (প্রতিটি ফাইলের জন্য) পরিবর্তন করা হয়েছে তা আউটপুট করতে হবে।
adamwong246

এটাই! আমি ঠিক এই সুইচটি খুঁজছিলাম!
অ্যাডাম আর্ল্ড

"গিট স্ট্যাটাস" ব্যবহার করবেন না কেন? এটি আপনাকে অবিরতবিহীন ফাইলগুলিও বলে।
নবীন পল

1
@ জিমিপল কারণ কখনও কখনও আপনি ইতিমধ্যে কমিট করেছেন। উদাহরণস্বরূপ আপনাকে মাস্টার এবং আপনার বর্তমান উন্নত শাখার মধ্যে পরিবর্তিত ফাইলের তালিকা তৈরি করতে হবেgit diff --name-only master..HEAD
হেটটোমি

68

পরিবর্তিত রেখার সংখ্যার মতো লাইন সংখ্যা বা পরিবর্তনগুলি সহ প্রকৃত লাইন নম্বরগুলি? আপনি যদি পরিবর্তিত লাইনের সংখ্যা চান তবে ব্যবহার করুন git diff --stat। এটি আপনাকে এর মতো একটি প্রদর্শন দেয়:

[me@somehost:~/newsite:master]> git diff --stat
 whatever/views/gallery.py |    8 ++++++++
 1 files changed, 8 insertions(+), 0 deletions(-)

নিজেরাই পরিবর্তনের লাইন নম্বর পাওয়ার কোনও বিকল্প নেই।


1
আমি আসল লাইন নম্বরগুলি ভাবছিলাম। ধন্যবাদ যদিও.
ওয়েই

আমি একরকম সন্দেহ করি এর জন্য তিনি জিইউআই সরঞ্জাম চান।
চোরমাস্টার

30

git diff master --compact-summary

আউটপুট হল:

 src/app/components/common/sidebar/toolbar/toolbar.component.html   |  2 +-
 src/app/components/common/sidebar/toolbar/toolbar.component.scss   |  2 --

এটি আপনার প্রয়োজন ঠিক এটি। আপনি যখন প্রতিশ্রুতিবদ্ধ বা রিমোট থেকে নতুন কমিটগুলি টানছেন তখন একই বিন্যাস।

PS: এটি তারযুক্ত যে কেউ এইভাবে উত্তর দেয় না।


1
এটি নির্দিষ্ট করা হয়নি। এটি এক বছর আগে প্রকাশিত 2.18 থেকে কাজ করে।
সীতবকির সিডামেটোভ

পারফেক্ট। এটি আমার পক্ষে কাজ করেছে এবং প্রতিক্রিয়া নিখুঁত।
ভিক্টর

15

1) আমার প্রিয়:

git diff --name-status

ফাইলের স্থিতি প্রস্তুত করে, যেমন:

A   new_file.txt
M   modified_file.txt 
D   deleted_file.txt

2) আপনি যদি পরিসংখ্যান চান, তবে:

git diff --stat

এর মতো কিছু দেখাবে:

new_file.txt         |  50 +
modified_file.txt    | 100 +-
deleted_file         |  40 -

3) অবশেষে, আপনি যদি কেবলমাত্র ফাইলের নাম চান:

git diff --name-only

কেবল প্রদর্শন করবে:

new_file.txt
modified_file.txt
deleted_file

4

এখন এবং নির্দিষ্ট কমিটের মধ্যে প্রতিটি ফাইলের পরিবর্তিত লাইনগুলির ফাইলের নাম এবং পরিমাণ / নুবার দেখায়:

git diff --stat <commit-hash>

2

আমি জানি এটি একটি পুরানো প্রশ্ন তবে উইন্ডোজে, এই গিট আউটপুটগুলিকে ফাইলগুলিতে ফিল্টার করে এবং রেখা সংখ্যার পরিবর্তিত করে:

(git diff -p --stat) | findstr "@@ --git"

diff --git a/dir1/dir2/file.cpp b/dir1/dir2/file.cpp
@@ -47,6 +47,7 @@ <some function name>
@@ -97,7 +98,7 @@ <another functon name>

সেগুলি থেকে ফাইলগুলি এবং পরিবর্তিত লাইনগুলি বের করার জন্য আরও কিছু কাজ করা হয়:

for /f "tokens=3,4* delims=-+ " %f in ('^(git diff -p --stat .^) ^| findstr ^"@@ --git^"') do @echo %f

a/dir1/dir2/file.cpp
47,7
98,7

1

সবচেয়ে পরিষ্কার আউটপুট, অর্থাত্ কেবল ফাইলের নাম / পাথ আসে

git diff-tree --no-commit-id --name-only -r

আছে HTH


0

চালু git version 2.17.1, এই উদ্দেশ্য অর্জনের জন্য একটি অন্তর্নির্মিত পতাকা নেই

ইউনিফাইড ডিফ থেকে ফাইলের নাম এবং লাইন নম্বরগুলি ফিল্টার করার জন্য এখানে একটি উদাহরণ কমান্ড:

git diff --unified=0 | grep -Po '^diff --cc \K.*|^@@@( -[0-9]+,[0-9]+){2} \+\K[0-9]+(?=(,[0-9]+)? @@@)' | paste -s -d':'

উদাহরণস্বরূপ, ইউনিফাইড ডিফ:

$ git diff --unified=0
diff --cc foobar
index b436f31,df63c58..0000000
--- a/foobar
+++ b/foobar
@@@ -1,2 -1,2 +1,6 @@@ Line abov
++<<<<<<< HEAD
 +bar
++=======
+ foo
++>>>>>>> Commit message

ফলাফল হবে:

❯ git diff --unified=0 | grep -Po '^diff --cc \K.*|^@@@( -[0-9]+,[0-9]+){2} \+\K[0-9]+(?=(,[0-9]+)? @@@)' | paste -s -d':'
foobar:1

কমন গ্রেপ ম্যাচের ফলাফলগুলিতে কমান্ডের আউটপুটটি মেলে:

$ git diff --unified=0 | grep -Po '^diff --cc \K.*|^@@@( -[0-9]+,[0-9]+){2} \+\K[0-9]+(?=(,[0-9]+)? )| @@@.*' | sed -e '0~3{s/ @@@[ ]\?//}' | sed '2~3 s/$/\n1/g' | sed "N;N;N;s/\n/:/g"
foobar:1:1:Line abov
  1. grep -Po '^diff --cc \K.*|^@@@( -[0-9]+,[0-9]+){2} \+\K[0-9]+(?=(,[0-9]+)? ): diff --cc <filename>OR ফাইলের সাথে OR নাম্বার নম্বর @@@ <from-file-range> <from-file-range> <to-file-range>মিল করুন বা বাকি পাঠ্যটির সাথে ম্যাচ করুন @@@
  2. sed -e '0~3{s/ @@@[ ]\?//}': এর @@@[ ]\?আগে .চ্ছিক 1 লাইন প্রসঙ্গটি পেতে প্রতিটি তৃতীয় লাইন থেকে সরান ++<<<<<<< HEAD
  3. sed '2~3 s/$/\n1/g': \n1কলাম সংখ্যার জন্য 2 য় এবং 3 য় লাইনের মধ্যে প্রতি 3 টি লাইন যুক্ত করুন ।
  4. sed "N;N;N;s/\n/:/g": প্রতি সাথে 3 লাইন যোগ দিন :

0

আমি grepএকটি নিষ্পাপ সমাধান হিসাবে ব্যবহার করি ।

$ git diff | grep -A2 -- '---'

একটি আউটপুট উদাহরণ:

--- a/fileA.txt
+++ b/fileA.txt
@@ -0,0 +1,132 @@
--
--- a/B/fileC.txt
+++ b/B/fileC.txt
@@ -33663,3 +33663,68800 @@ word_38077.png,Latin
--
--- a/D/fileE.txt
+++ b/D/fileE.txt
@@ -17998,3 +17998,84465 @@ word_23979.png,Latin
--
--- a/F
+++ b/F
@@ -1 +1 @@

হতে পারে আপনি একটি রঙিন আউটপুট দেখতে পারেন। এটি আপনাকে আউটপুটগুলি সহজেই পড়তে সহায়তা করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.