প্যাটার্ন অনুসারে পুনরাবৃত্তভাবে ফাইলগুলি যুক্ত করুন


172

কীভাবে আমি বিভিন্ন ডিরেক্টরিতে অবস্থিত একটি প্যাটার্ন (বা গ্লোব) দ্বারা পুনরাবৃত্তভাবে ফাইলগুলি যুক্ত করব?

উদাহরণস্বরূপ, আমি একটি কমান্ড সহ A/B/C/foo.javaএবং D/E/F/bar.java(এবং আরও বেশ কয়েকটি জাভা ফাইল) যুক্ত করতে চাই:

git add '*.java'

দুর্ভাগ্যক্রমে, এটি প্রত্যাশার মতো কাজ করে না।


2
এটি আমার জন্য কাজ করে (ম্যাক ওএস এক্স, গিট 1.7.1+)। আপনি কোন ওএস এবং গিট সংস্করণ ব্যবহার করছেন?
ক্রিস জনসন

3
.javaআপনার বর্তমান ডিরেক্টরিতে যদি কিছু (ইতিমধ্যে ট্র্যাক করা) ফাইল থাকে তবে আপনি বাশ এবং এমএসএসি কমান্ড-লাইন "সহায়ক" এর মধ্যে জটিল ওয়াইল্ডকার্ড পরিচালনা করছেন । আমি কোন সমাধান সম্পর্কে নিশ্চিত নই। আপনি উদ্ধৃতিগুলির একাধিক স্তর চেষ্টা করতে পারেন: git add '"*.java"'(গ্লোব সম্প্রসারণ রোধ করতে একক উক্তিগুলি ব্যাশ দ্বারা নেওয়া হয় , গ্লোব সম্প্রসারণ রোধের জন্য এমএসএস স্তর দ্বারা ডাবল উদ্ধৃতি নেওয়া হয়)।
ক্রিস জনসেন

1
নোটের জন্য ধন্যবাদ। দুর্ভাগ্যক্রমে, এটিও কাজ করে না। তারা বলে যে এটি ঠিক করা হয়েছে তবে আমার কাছে ইতিমধ্যে সর্বশেষতম সংস্করণ রয়েছে।
মিশেল ক্রিমার


1
git add *.javaআমার জন্য কাজ করে (গিটহাব ক্লায়েন্টের সাথে পাওয়ারশেলের উপর)
থাডাফিন্সার

উত্তর:


88

সেরজিও আকোস্টার উত্তর সম্ভবত আপনার সেরা বাজি যদি যোগ করা কিছু ফাইল ইতিমধ্যে ট্র্যাক না করা হয়। আপনি যদি নিজের মধ্যে ফাইল গিট সম্পর্কে সীমাবদ্ধ রাখতে চান তবে ইতিমধ্যে আপনি এই git-ls-filesফিল্টারটি একত্রিত করতে পারেন :

git ls-files [path] | grep '\.java$' | xargs git add

গিট এটি নিজেই করার জন্য কোনও অভিনব পদ্ধতি সরবরাহ করে না, কারণ এটি মূলত একটি শেল সমস্যা: আপনি প্রদত্ত কমান্ডের পক্ষে যুক্তি হিসাবে ফাইলগুলির তালিকা কীভাবে পাবেন।


8
ধন্যবাদ! আমি আপনার আদেশটি কিছুটা উন্নত করেছি এবং এখন আমি যা খুঁজছিলাম তা করছে:git ls-files -co --exclude-standard | grep '\.java$' | xargs git add
মিশেল ক্রিমার

169

আপনি git add [path]/\*.javaসাব-ডিরেক্টরি থেকে জাভা ফাইল যুক্ত করতে ব্যবহার করতে পারেন ,
যেমন git add ./\*.javaবর্তমান ডিরেক্টরিতে।

git addডকুমেন্টেশন থেকে :

ডিরেক্টরি এবং এর *.txtউপ- Documentationডিরেক্টরিতে সমস্ত ফাইল থেকে সামগ্রী যুক্ত করে :

$ git add Documentation/\*.txt

নোট করুন যে *এই উদাহরণটিতে শেল থেকে তারকাচিহ্ন উদ্ধৃত হয়েছে; এটি কমান্ডের সাহায্যে ডিরেক্টরিটির Documentation/ডিরেক্টরি উপ- ডিরেক্টরি থেকে অন্তর্ভুক্ত করা যায় ।


2
@ মিশেলক্রিমার সম্ভবত এটি ছিল না, তবে এখন তা।
আলবার্তো

7
এটি সেরা সমাধান, উইন্ডোতেও কাজ করে।
TheTFo

1
"শেল থেকে তারকাচিহ্ন * উদ্ধৃত হয়"। আমি মনে করি আপনি "পলায়ন" বলতে চাইছেন। যে কোনও ক্ষেত্রে, ব্যাকস্ল্যাশটি শেলটিকে প্রসারিত হতে বাধা দেয়।
বিশ্বব্যাপী

1
@ বিশ্বব্যাপী আমি মনে করি আপনি ঠিক বলেছেন, তবে এটি আমি নই। এটি git-scm.com/docs/git-add#_ উদাহরণগুলির
সের্গেই গ্লোটোভ

62

zshআপনি চালাতে পারেন সাথে :

git add "**/*.java"

এবং আপনার সমস্ত *.javaফাইল পুনরাবৃত্তভাবে যোগ করা হবে।


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

1
ঠিক আছে, আমি দেখতে পাচ্ছি যে zshউইন্ডোগুলির জন্য একটি শেল রয়েছে ... আপনি বাশ, ইমো পরিবর্তে এটি ব্যবহার করার পক্ষে নিজেকে সমর্থন করবেন।
অলিভিয়ার ভারদিয়ার

1
Zsh এর উইন্ডোজ বন্দরটি একটি পুরানো সংস্করণে ভিত্তিক এবং সর্বদা ক্রাশ হয় (উদাহরণস্বরূপ আমি যখন প্রবেশ করি ls)।
মিশেল ক্রিমার

বাহ, নিখুঁত। আমি এই বৈশিষ্ট্য সম্পর্কে জানতাম না!
টোম ভাত্রুবা

1
এটি zsh এর সাথে কোন সম্পর্ক নেই। আমি মনে করি এই উত্তরটি বিন্দুটি মিস করেছে যে আপনি গিটার জন্য অক্ষত ওয়াইল্ডকার্ডের সাথে পথটি পাস করতে চান এবং গিটটি প্রক্রিয়াটি করতে দিন। অতএব আপনি যে কোনও শেলটি ওয়াইল্ডকার্ড (গুলি) প্রসারিত থেকে ব্যবহার করছেন তা প্রতিরোধ করতে চান। এটি করার জন্য আপনাকে এটিকে এমন কোনওভাবে উদ্ধৃত করতে হবে যা আপনি ব্যবহার করছেন শেলের জন্য উপযুক্ত। বিশদ জন্য অন্যান্য উত্তর দেখুন।
বিশ্বব্যাপী

55

কিছুটা অফ টপিক (বিশেষত গিট সম্পর্কিত নয়) তবে আপনি যদি লিনাক্স / ইউনিক্সে থাকেন তবে কার্যনির্বাহী হতে পারে:

find . -name '*.java' | xargs git add

এবং যদি আপনি স্পেস সহ পাথগুলি আশা করেন:

find . -name '*.java' -print0 | xargs -0 git add

তবে আমি জানি যে আপনি যা চেয়েছিলেন ঠিক তা নয়।


6
এই পদ্ধতির সাথে সামান্য সমস্যা - যদি আপনি .gitignore এর সাথে মিলে যায় এমন কোনও ফাইল "সন্ধান" করেন তবে গিট অভিযোগ করেন যে আপনি কোনও ফাইল যুক্ত করার চেষ্টা করছেন যা আপনি এড়াতে বলেছেন।
ইয়োও

2
@ ইয়য়ো - শেষের দিকে আমি সবেমাত্র যোগ করেছি, এবং এটি স্থির করে দিয়েছে
মাসলো

5
@ মাসলো, এটি ফাইলটিকে জোর করে যুক্ত করা হবে, যদিও এটি উপেক্ষা করা হবে বলে মনে করা হয়েছিল (.gitignore এর ভিত্তিতে)। আমি অভিযোগ পেতে এবং ফাইলটি যুক্ত না করা পছন্দ করব (যা পূর্বনির্ধারিত আচরণ))
yoo

গিটটি ওয়াইল্ডকার্ড সম্প্রসারণ সম্পাদন করার চেয়ে কীভাবে এটি কোনওভাবে ভাল?
বিশ্বব্যাপী

12

সের্গির উত্তর (আমাকে কৃতিত্ব দেবেন না) কাজ করছে:

You can use git add [path]/\*.java

সাম্প্রতিক গিট সহ:

$git version
git version 1.7.3.4

পরীক্ষার জন্য ফাইলগুলি:

$find -name .git -prune -o -type f -print | sort
./dirA/dirA-1/dirA-1-1/file1.txt
./dirA/dirA-1/dirA-1-2/file2.html
./dirA/dirA-1/dirA-1-2/file3.txt
./dirA/dirA-1/file4.txt
./dirB/dirB-1/dirB-1-1/file5.html
./dirB/dirB-1/dirB-1-1/file6.txt
./file7.txt

গিট স্ট্যাটাস:

$git status -s
?? dirA/
?? dirB/
?? file7.txt

* .Txt যোগ করা হচ্ছে:

$git add \*.txt

আপডেট অবস্থা:

$git status -s
A  dirA/dirA-1/dirA-1-1/file1.txt
A  dirA/dirA-1/dirA-1-2/file3.txt
A  dirA/dirA-1/file4.txt
A  dirB/dirB-1/dirB-1-1/file6.txt
A  file7.txt
?? dirA/dirA-1/dirA-1-2/file2.html
?? dirB/dirB-1/dirB-1-1/file5.html

8

আপনি যদি ইতিমধ্যে আপনার ফাইলগুলি ট্র্যাক করে থাকেন এবং সেগুলিতে পরিবর্তন করেছেন এবং এখন আপনি একটি প্যাটার্নের ভিত্তিতে বেছে বেছে যুক্ত করতে চান তবে আপনি --modifiedপতাকাটি ব্যবহার করতে পারেন

git ls-files --modified | grep '<pattern>' | xargs git add

উদাহরণস্বরূপ, আপনি যদি এই প্রতিশ্রুতিতে সিএসএস পরিবর্তনগুলি যুক্ত করতে চান তবে আপনি এটি করতে পারেন

git ls-files --modified | grep '\.css$' | xargs git add

দেখুন man git-ls-filesআরো পতাকার জন্য


5

শুধু ব্যবহার git add *\*.java। এটি রুট ডিরেক্টরি এবং সমস্ত উপ-ডিরেক্টরিতে সমস্ত। জাভা ফাইল যুক্ত করবে।


দুর্দান্ত উত্তর। আমি সমস্ত ফাইলের নাম পম.এক্সএমএল যুক্ত করতে * / pom.xML যোগ করতে পেরেছি।
ফিলিপ রেগো

4

উইন্ডোজ কমান্ড লাইন সমাধান যুক্ত করা যা এখনও উল্লেখ করা হয়নি:

for /f "delims=" %G in ('dir /b/s *.java') do @git add %G

3

আমি কেবলমাত্র এমন ফাইলগুলি যুক্ত করতে চেয়েছিলাম যার উপর ভিত্তি করে একটি নির্দিষ্ট স্ট্রিং রয়েছে git status:

git status | grep string | xargs git add

এবং তারপরে git commit -m 'commit msgফাইলটির শিরোনামে "স্ট্রিং" দিয়ে সমস্ত পরিবর্তিত ফাইল প্রতিশ্রুতিবদ্ধ করতে সক্ষম হয়েছিল


2

" গিট: এ উল্লিখিত হিসাবে : কীভাবে আমি বিশ্বব্যাপী প্যাটার্নের সাথে মেলে এমন ডিরেক্টরি সাবট্রিগুলিতে আমি পুনরাবৃত্তভাবে সমস্ত ফাইল যুক্ত করব? ", আপনি যদি সঠিকভাবে পালাতে বা আপনার প্যাথস্পেক গ্লোব্বিংয়ের (যেমন '*.java') উদ্ধৃতি দেন , তবে হ্যাঁ, গিট অ্যাড'*.java'

গিট 2.13 (কিউ 2 2017) ইন্টারেক্টিভ অ্যাডের জন্য এটি উন্নত করে:

দেখুন কমিট 7288e12 (14 মার্চ 2017) দ্বারা জেফ কিং ( peff)
(দ্বারা একীভূত junio সি Hamano - gitster- মধ্যে কমিট 153e0d7 , 17 মার্চ 2017)

add --interactive: এর সাথে প্যাথস্পেকগুলি প্রসারিত করবেন না ls-files

আমরা যখন পরিবর্তিত ফাইলগুলির তালিকা পেতে চাই, আমরা প্রথমে " ls-files" ব্যবহারকারীর দ্বারা সরবরাহিত কোনও প্যাথস্পেকগুলি প্রসারিত করি এবং তারপরে " diff-index" এবং " diff-files" এর সাথে যুক্ত পাথের ফলস্বরূপ তালিকাটি ফিড করি ।
যদি আপনার পাথস্পেকটি একটি বিশাল সংখ্যক পাথের মধ্যে প্রসারিত হয় তবে আপনি দুটি সমস্যার মধ্যে একটিতে দৌড়াতে পারেন:

  1. ওএস আর্গুমেন্ট তালিকার আকার সম্পর্কে অভিযোগ করতে পারে এবং চালাতে অস্বীকার করে। উদাহরণ স্বরূপ:

    $ (ulimit -s 128 && git add -p drivers)
    Can't exec "git": Argument list too long at .../git-add--interactive line 177.
    Died at .../git-add--interactive line 177.
    

এটি linux.gitসংগ্রহস্থলটিতে রয়েছে, যার "ড্রাইভার" ডিরেক্টরিতে প্রায় 20K ফাইল রয়েছে (তাদের মধ্যে কোনওটিই এই ক্ষেত্রে সংশোধিত হয়নি)। ulimit -sলিনাক্সটিতে এমন বিশাল পথের জন্য এমনকি " " সমস্যাটি দেখানোর জন্য কৌশলটি প্রয়োজনীয়।
অন্যান্য অপারেটিং সিস্টেমে অনেক ছোট সীমা থাকে (উদাহরণস্বরূপ, ওএস এক্স-তে কেবল 5K ফাইলের সাথে একটি আসল ওয়ার্ল্ড কেস দেখা যায়)।

  1. এমনকি যখন এটি কাজ করে, এটি সত্যই ধীর। পাথস্পেক কোড বিপুল সংখ্যক পাথের জন্য অনুকূলিত নয়। এখানে উলিমিট ছাড়া একই ঘটনা:

    $ time git add -p drivers
      No changes.
    
    real  0m16.559s
    user    0m53.140s
    sys 0m0.220s
    

আমরা এটিকে ls-filesপুরোপুরি এড়িয়ে যাওয়া , এবং কেবলমাত্র পৃথক কমান্ডগুলিতে মূল প্যাথস্পেকগুলি খাওয়ানোর মাধ্যমে এটি উন্নত করতে পারি ।

Icallyতিহাসিকভাবে " diff-index" দ্বারা সমর্থিত প্যাথস্পেক ভাষা দুর্বল ছিল, তবে এখন আর তা হয় না।


1

line / .gitconfig এ লাইন দিন

[alias] addt = !sh -c 'git ls-files | grep \"\\.$1*\" | xargs git add' -

আপনি যদি সমস্ত পরিবর্তিত জাভা ফাইল যুক্ত করতে চান তবে তা করতে পারেন: git addt java

একইভাবে, আপনি যদি সমস্ত সংশোধিত পাইথন ফাইল যুক্ত করতে চান তবে তা করতে পারেন: git addt py

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