'গিট লগ' তৈরি করা নির্দিষ্ট পাথের পরিবর্তনগুলি উপেক্ষা করে


121

আমি কীভাবে git logকেবলমাত্র কমিটগুলি প্রদর্শন করতে পারি যেগুলি আমি নির্দিষ্ট করা ফাইলগুলি বাদ দিয়ে অন্য ফাইল পরিবর্তন করেছে?

এর মাধ্যমে git log, আমি যে পথ দেখায় সেগুলির সেটগুলিকে স্পর্শ করে তাদের প্রতি আমি যে কমিটগুলি দেখছি তা ফিল্টার করতে পারি। আমি যা চাই তা হ'ল সেই ফিল্টারটি উল্টানো যাতে কেবলমাত্র সেই নির্দিষ্ট সংস্থাগুলি ব্যতীত সেই স্পর্শ পাথগুলি তালিকাবদ্ধ করা হয়।

আমি যা চাই তা পেতে পারি

git log --format="%n/%n%H" --name-only | ~/filter-log.pl | git log --stdin --no-walk

কোথায় filter-log.pl:

#!/usr/bin/perl
use strict;
use warnings;

$/ = "\n/\n";
<>;

while (<>) {
    my ($commit, @files) = split /\n/, $_;

    if (grep { $_ && $_ !~ m[^(/$|.etckeeper$|lvm/(archive|backup)/)] } @files) {
        print "$commit\n";
    }
}

আমি এর চেয়ে কিছুটা মার্জিত কিছু চাই।

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

সম্পর্কিত প্রশ্ন: কীভাবে `গিট লগ --grep = <Pattern> in বা কীভাবে গিট লগগুলি দেখা যায় যা কোনও প্যাটার্নের সাথে মেলে না সেগুলি পথের চেয়ে বার্তা দেওয়ার ব্যতীত একই প্রশ্ন।

২০০৮ সাল থেকে এই বিষয়ে ফোরামের আলোচনা: পুন: গিট-ডিফ থেকে ফাইলগুলি বাদ দেওয়া এটি আশাব্যঞ্জক মনে হলেও থ্রেডটি শুকিয়ে গেছে বলে মনে হচ্ছে।


আমি অন্তর্নির্মিত উপায় আছে কিনা তা নিশ্চিত নই এবং আপনার পার্ল সমাধানটি বেশ শালীন দেখায়। আপনি যদি কমান্ড-লাইন আর্গুমেন্ট হিসাবে পাথগুলি গ্রহণ করার জন্য এটি পরিবর্তন করে থাকেন তবে আপনি কেবল একটি উলামের মতো কিছু তৈরি করতে পারেন !f() { git log ... | path/to/filter-log.pl "$@" | git log --stdin --no-walk; f, বা সেই পাইপলাইনের অংশটি স্ক্রিপ্টের মধ্যেও গুটিয়ে রাখতে পারেন।
ক্যাসাবেল

কার্যকারণ হিসাবে, আমি findযে ডিরেক্টরিগুলি দেখতে চাই না তার ডিরেক্টরিগুলি ফিল্টার আউট ব্যবহার করি। আমি যদি মূল-স্তরের ডিরেক্টরিতে করা SiteConfiggit log `find . -type d -mindepth 1 -maxdepth 1 ! -name *SiteConfig`
কমিটগুলি

গিট 1.9 / 2.0 (Q1 2014) এর জন্য, নীচে আমার উত্তরটি দেখুন : git log --oneline --format=%s -- . ":!sub"কাজ করবে ( প্যাথস্পেক যাদু :(exclude)এবং এর সংক্ষিপ্ত রূপের সাথে:! )
ভোনসি

উত্তর:


214

এটা এখন প্রবর্তনের সঙ্গে (Git 1.9 / 2.0, চতুর্থাংশ 1 2014) বাস্তবায়িত হয় pathspec যাদু :(exclude)ও তার সংক্ষিপ্ত রূপ:! মধ্যে ef79b1f কমিট এবং 1649612 কমিট দ্বারা গান Nguyễn গান Thái আরো Ngọc গান Duy ( pclouds) , ডকুমেন্টেশন পাওয়া যাবে এখানে

আপনি এখন একটি সাব-ফোল্ডার সামগ্রী বাদে সবকিছু লগ করতে পারেন:

git log -- . ":(exclude)sub"
git log -- . ":!sub"

অথবা আপনি সেই সাব-ফোল্ডারের মধ্যে নির্দিষ্ট উপাদান বাদ দিতে পারেন can

  • একটি নির্দিষ্ট ফাইল:

      git log -- . ":(exclude)sub/sub/file"
      git log -- . ":!sub/sub/file"
    
  • এর মধ্যে প্রদত্ত যে কোনও ফাইল sub:

      git log -- . ":(exclude)sub/*file"
      git log -- . ":!sub/*file"
      git log -- . ":(exclude,glob)sub/*/file"
    

আপনি এই বর্জন মামলা সংবেদনশীল করতে পারেন!

git log -- . ":(exclude,icase)SUB"

যেমন কেনি এভিট উল্লেখ করেছেন

আপনি যদি বাশ শেলটিতে গিট চালাচ্ছেন তবে ত্রুটিগুলি এড়াতে ':!sub'বা ":\!sub"পরিবর্তে ব্যবহার করুনbash: ... event not found


দ্রষ্টব্য: গীত 2.13 (Q2 এর 2017) একটি প্রতিশব্দ যোগ হবে ^থেকে!

কমিট 859b7f1 দেখুন , লিনাস টোরভাল্ডস ( ) দ্বারা 42ebeb9 (08 ফেব্রুয়ারী 2017 ) প্রতিশ্রুতিবদ্ধ করুন(দ্বারা একীভূত junio সি Hamano - - মধ্যে কমিট 015fba3 , 27 ফেব্রুয়ারী 2017)torvalds
gitster

প্যাথস্পেক যাদু: ' ^' এর জন্য উপন্যাস হিসাবে ' !' যুক্ত করুন

!নেতিবাচক প্যাথস্পেকের জন্য ' ' এর পছন্দটি শেষ হয় কেবল সংশোধনগুলির জন্য আমরা যা করি না তার সাথে মিলে যায় না, এটি শেল সম্প্রসারণের জন্য একটি বীভৎস চরিত্রও যেহেতু এটির উদ্ধৃতি প্রয়োজন।

সুতরাং ^একটি প্যাথস্পেক এন্ট্রি বাদ দিয়ে বিকল্প عرف হিসাবে ' ' যুক্ত করুন ।


দ্রষ্টব্য, গিট ২.২৮ (Q3 2020) এর আগে, কার্যক্ষম গাছের তালাবিহীন রাস্তাগুলি সহ পাথ সংগ্রহ করার সময় নেতিবাচক প্যাথস্পেকের ব্যবহার ভেঙে গিয়েছিল।

দেখুন f1f061e কমিট (05 জুন 2020) দ্বারা ইলিয়াস Newren ( newren)
(দ্বারা একীভূত junio সি Hamano - gitster- মধ্যে কমিট 64efa11 , 18 জুন 2020)

dir: অবহেলিত প্যাথস্পেকগুলির চিকিত্সা ঠিক করুন

রিপোর্ট-বাই: জন মিলিকিন
সাইন-অফ-বাই: এলিজা নিউরেন

do_match_pathspec()জীবন শুরু match_pathspec_depth_1()হয়েছিল যেমন এবং সঠিকতার জন্য কেবল তখন থেকেই ডাকা হত match_pathspec_depth() match_pathspec_depth()পরে নামকরণ করা হয় match_pathspec(), তাই পরিবর্তিত আমরা আশা আজ যে do_match_pathspec()কোন প্রত্যক্ষ কলারের বাহিরে হয়েছে match_pathspec()

দুর্ভাগ্যবশত, এই উদ্দেশ্য দুই ফাংশন renames সঙ্গে হারিয়ে গেছে, এবং অতিরিক্ত কল do_match_pathspec()করে এ যোগ করা হয় নি 75a6315f74 ( " ls-files: submodules জন্য pathspec ম্যাচিং যোগ", 2016-10-07, গীত v2.11.0-rc0 - একত্রীকরণ তালিকাভুক্ত ব্যাচ # 11 ) এবং 89a1f4aaf7 (" dir: যদি আমাদের প্যাথস্পেক একটি ডিরের নীচে ফাইলগুলির সাথে মেলে তবে এটিতে পুনরাবৃত্তি হবে", 2019-09-17, গিট ভি 2.24.0-আরসি0)।

অবশ্যই, do_match_pathspec()একটি গুরুত্বপূর্ণ সুবিধা ছিল match_pathspec()- match_pathspec()দুটি দুটি মানগুলির মধ্যে একটিতে হার্ডকোড হবে, এবং এই নতুন কলকারীদের পতাকাগুলির জন্য কিছু অন্যান্য মান পাস করার প্রয়োজন ছিল।

এছাড়াও, যদিও do_match_pathspec()সরাসরি কল করা ভুল ছিল, পর্যবেক্ষণযোগ্য শেষ আউটপুটটিতে সম্ভবত কোনও পার্থক্য ছিল না, কারণ বাগটি কেবলমাত্র fill_diretory()অনির্বাচিত ডিরেক্টরিগুলিতে পুনরাবৃত্তি করবে বলে বোঝায় ।

যেহেতু পরবর্তী সময়ে ডিরেক্টরিটির অধীনে পৃথক পাথগুলিতে এই-প্যাথ-ম্যাচের চেকগুলি সেই অতিরিক্ত পাথগুলিকে ফিল্টার করে ফেলতে পারে, তাই ভুল ফাংশনটি ব্যবহার করার একমাত্র পার্থক্য ছিল অপ্রয়োজনীয় গণনা।

এইসব খারাপ কলগুলির মধ্যে দ্বিতীয়টি do_match_pathspec()সরাসরি যুক্ত আন্দোলনের মাধ্যমে বা অনুলিপি + সম্পাদনার মাধ্যমে - পরবর্তী সময়ে বেশ কয়েকটি রিফ্যাক্টরের মাধ্যমে জড়িত ছিল।

করে দেখুন 777b420347 ( " dir: সিংক্রোনাইজ treat_leading_path()এবং read_directory_recursive()", 2019-12-19, গীত v2.25.0-rc0 - একত্রীকরণ ), 8d92fb2927 ( " dir: একটি রৈখিক এক সঙ্গে সূচকীয় অ্যালগরিদম প্রতিস্থাপন", 2020-04-01, গীত v2.27.0 -rc0 - একত্রীকরণ তালিকাভুক্ত ব্যাচ # 5 ), এবং 95c11ecc73 ( "ফিক্স ত্রুটি-প্রবণ fill_directory()এপিআই; এটি শুধুমাত্র ম্যাচ আসতে করুন" 2020-04-01, গীত v2.27.0-rc0 - একত্রীকরণ তালিকাভুক্ত ব্যাচ # 5 ) ।

এর মধ্যে সর্বশেষ do_match_pathspec()ব্যক্তি পৃথক ফাইলে ব্যবহারের প্রবর্তন করেছিল এবং ফলস্বরূপ পৃথক পাথগুলি ফিরে আসে যা হওয়া উচিত নয়।

do_match_pathspec()পরিবর্তে কল করার ক্ষেত্রে সমস্যাটি match_pathspec()হ'ল '`:! অযাচিত_পথ'এর মতো অবহেলিত ধরণগুলি উপেক্ষা করা হবে

match_pathspec_with_flags()এখনও সঠিকভাবে উপেক্ষিত নিদর্শনগুলি পরীক্ষা করার সময় বিশেষ পতাকাগুলি নির্দিষ্ট করার প্রয়োজনগুলি পূরণ করার জন্য একটি নতুন ফাংশন যুক্ত করুন, do_match_pathspec()অন্যদের এটির অপব্যবহার থেকে রোধ করতে উপরের দিকে একটি বড় মন্তব্য যুক্ত করুন এবং do_match_pathspec()পরিবর্তে হয় match_pathspec()অথবা ব্যবহারের পরিবর্তে বর্তমান কলকারীদের সঠিক করুন match_pathspec_with_flags()

একটি চূড়ান্ত নোট হ'ল এর DO_MATCH_LEADING_PATHSPECসাথে কাজ করার সময় বিশেষ বিবেচনা করা দরকার DO_MATCH_EXCLUDE

বিন্দু DO_MATCH_LEADING_PATHSPECযে আমরা মত একটি pathspec আছে যদি

*/Makefile

এবং আমরা ডিরেক্টরি ডিরেক্টরি যেমন পরীক্ষা করছি

src/module/component

যে আমরা এটি একটি ম্যাচ বিবেচনা করতে চাই যাতে আমরা ডিরেক্টরিতে পুনরাবৃত্তি করি কারণ এর _might_ এর Makefileনীচে কোথাও একটি ফাইল রয়েছে ।

যাইহোক, যখন আমরা একটি বর্জনীয় প্যাটার্ন ব্যবহার করি, অর্থাৎ আমাদের কাছে একটি প্যাথস্পেকের মতো থাকে

:(exclude)*/Makefile

আমরা বলতে চাই না যে একটি ডিরেক্টরি পাথ পছন্দ করে

src/module/component

একটি (নেতিবাচক) ম্যাচ।

সেখানে থাকাকালীন পারে ডিরেক্টরিটি নীচের 'Makefile নামক' কোথাও নামের একটি ফাইল থাকে, সেখানে অন্যান্য ফাইল হতে পারে এবং আমরা প্রাক emptively দিতে পারে না যে ডিরেক্টরির আউট অধীনে সমস্ত ফাইল নিয়ম; আমাদের পুনরাবৃত্তি করতে হবে এবং তারপরে স্বতন্ত্র ফাইলগুলি পরীক্ষা করতে হবে।

DO_MATCH_LEADING_PATHSPECশুধুমাত্র ইতিবাচক প্যাথস্পেকগুলির জন্য সক্রিয় হওয়ার জন্য যুক্তিটি সামঞ্জস্য করুন ।


7
আপনি একাধিক ফাইল করতে পারেন?
জাস্টিন থমাস

12
@ জাস্টিন থমাস আমি বিশ্বাস করি (এখনও পরীক্ষা হয়নি) আপনি একাধিকবার সেই পথ বর্জনীয় প্যাটার্নটি পুনরুক্ত করতে পারবেন ":(exclude)pathPattern1" ":(exclude)pathPattern2", তাই একাধিক ফোল্ডার / ফাইল উপেক্ষা করে।
ভোনসি

7
আপনি যদি বাশ শেলের মধ্যে গিট চালাচ্ছেন তবে ত্রুটিগুলি এড়াতে এর':!sub' পরিবর্তে ব্যবহার করুন । কাজ করে না bash: ... event not found":\!sub"
কেনি এভিট

1
@ কেনেভিট আপনার সম্পাদনা এবং মন্তব্যের জন্য ধন্যবাদ। আমি আরও দৃশ্যমানতার জন্য উত্তরটিকে উত্তরটিতে অন্তর্ভুক্ত করেছি।
ভনসি

2
এই কার্যকারিতা সম্পর্কে অফিসিয়াল ডকুমেন্টেশনগুলি কোথায় রয়েছে তা নিয়ে ভাবছেন, দেখুন git help glossary(যা আমি তালিকাভুক্ত পেয়েছি git help -g[যা আমি প্রস্তাবিত পেয়েছি git help])।
রেভ্রন

4

TL; ড: shopt -s extglob && git log !(unwanted/glob|another/unwanted/glob)

আপনি যদি ব্যাশ ব্যবহার করছেন তবে আপনার কেবলমাত্র প্রয়োজনীয় ফাইলগুলি পেতে বর্ধিত গ্লোববিং বৈশিষ্ট্যটি ব্যবহার করতে সক্ষম হওয়া উচিত :

$ cd -- "$(mktemp --directory)" 
$ git init
Initialized empty Git repository in /tmp/tmp.cJm8k38G9y/.git/
$ mkdir aye bee
$ echo foo > aye/foo
$ git add aye/foo
$ git commit -m "First commit"
[master (root-commit) 46a028c] First commit
 0 files changed
 create mode 100644 aye/foo
$ echo foo > bee/foo
$ git add bee/foo
$ git commit -m "Second commit"
[master 30b3af2] Second commit
 1 file changed, 1 insertion(+)
 create mode 100644 bee/foo
$ shopt -s extglob
$ git log !(bee)
commit ec660acdb38ee288a9e771a2685fe3389bed01dd
Author: My Name <jdoe@example.org>
Date:   Wed Jun 5 10:58:45 2013 +0200

    First commit

globstarপুনরাবৃত্ত ক্রিয়াকলাপের জন্য আপনি এর সাথে একত্রিত করতে পারেন ।


7
এটি আর বিদ্যমান নেই এমন ফাইলগুলিকে প্রভাবিত করে প্রতিশ্রুতিগুলি প্রদর্শন করে না। খুব কাছাকাছি এবং চমৎকার হ্যাক সব একই।
অজ্ঞাতনামা

-2

আপনি এখানে একটি ফাইলের পরিবর্তনগুলি সাময়িকভাবে উপেক্ষা করতে পারেন :

git update-index --skip-worktree path/to/file

এগিয়ে নিয়ে যাওয়া, ঐ ফাইল সকল পরিবর্তন দ্বারা উপেক্ষিত হবে git status, git commit -aইত্যাদি যখন আপনি ঐ ফাইল কমিট প্রস্তুত, শুধু এটা বিপরীত:

git update-index --no-skip-worktree path/to/file

এবং স্বাভাবিক হিসাবে প্রতিশ্রুতিবদ্ধ।


9
এটি কিছুটা পৃথক পরিস্থিতি সম্বোধন করে। ইতিমধ্যে করা কমিটগুলি ফিল্টার করার git update-index --skip-worktreeকারণ হয় না git log
অজ্ঞাতনামা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.