সাব-ডিরেক্টরিগুলির মাধ্যমে লুপিং এবং প্রতিটিটিতে একটি কমান্ড চালানো


47

আমার ভিসিএস (গিট, মার্কুরিয়াল, এসভিএন) এর উপর ভিত্তি করে ডিরেক্টরিতে সাজানো একটি সংগ্রহস্থল রয়েছে। সাবভার্সন দিয়ে আমি পিতামহিত svn update *ডিরেক্টরিতে চালাতে সক্ষম হয়েছি এবং এটি প্রতিটি ডিরেক্টরি লুপ করে প্রতিটি প্রত্যাশাকে প্রত্যাশা অনুযায়ী আপডেট করে। এটি গিট বা মারকুরিয়ালের ক্ষেত্রে নয়।

আমি একটি ব্যাশ স্ক্রিপ্ট নিয়ে আসা যে আমি ডিরেক্টরি মাধ্যমে এবং হয় ঠিক, লুপ করতে চালাতে পারেন চাই git pullবা hg pullপ্রতিটি। আমার খুব বেশি বাশ স্ক্রিপ্টিং অভিজ্ঞতা নেই।


আপনি কি কমান্ডগুলি পুনরাবৃত্তভাবে কার্যকর করতে চান তা স্পষ্ট করে বলা যেতে পারে (সমস্ত সাবফোল্ডারগুলিতে), যেখানে এমজে 41 এর উত্তরই কেবল আমি চেষ্টা করেছি (এখান থেকে এবং অন্যান্য এসও সাইটগুলিতে) যা তা করে।
r_alex_hall

* এটি একটি টুইটের সাথে এটি করে যা আমি এটিতে একটি মন্তব্যে উল্লেখ করি।
r_alex_hall

উত্তর:


81
for dir in ~/projects/git/*; do (cd "$dir" && git pull); done

2
Thnx ... তবে আমার ত্রুটিগুলিও ক্যাপচার করা দরকার। আমি কিভাবে এটি করতে পারেন। আমি এর আগে কখনও শেল প্রোগ্রামিং করিনি।
শাশ্বত

23

আপনার যদি এটি পুনরুক্তি করা প্রয়োজন:

find . -type d -name .git -exec sh -c "cd \"{}\"/../ && pwd && git pull" \;

এটি বর্তমানের অধীনে সমস্ত ডিরেক্টরিতে নেমে যাবে এবং সেই সাব-ডিরেক্টরিতে একটি গিট টান সঞ্চালন করবে যার একটি .git ডিরেক্টরি রয়েছে (আপনি এটি দিয়ে সীমাবদ্ধ করতে পারেন -maxdepth)।


@ থাইপ্রাইভেলিজ: চালাক!
ডেনিস উইলিয়ামসন

9
-execdirএখানে আরও ভাল:find . -type d -name .git -execdir sh -c "pwd && git pull" \;
ড্যানিয়েল কুলম্যান

এটি আমার বিষয়গত মতামতের একটি উত্তম উত্তর ... আমার জন্য অবিলম্বে কাজ করেছেন .. চিয়ার্স
ভোক রান্সম আনিঘোরো

আমাকে এখানে যুক্ত হওয়া প্রশ্নের বিপরীতে, এই আদেশটি আসলে কাজ করেছিল actually ধন্যবাদ.
ব্যবহারকারী 1445967

7

আপনার যদি জিএনইউ সমান্তরাল http: // www.gnu.org/software/parallel/ ইনস্টল করা থাকে তবে আপনি এটি করতে পারেন:

cd ~/projects/git/; ls | parallel 'cd {} && git pull'

এটি সমান্তরালে চলবে তাই যদি গিট সার্ভারের কিছু নেটওয়ার্ক সংযোগ ধীর হয়ে যায় তবে এটি জিনিসগুলিকে গতি বাড়িয়ে তুলতে পারে।

আরও জানতে জিএনইউ সমান্তরালের জন্য অন্তর্ভুক্ত ভিডিওটি দেখুন: http://www.youtube.com/watch?v=OpaiGYxkSuQ


হয়তো না ls */কি নিশ্চিত যে আপনি সুসঙ্গত ইনপুট প্রদান করছি হতে cd
জো কর্নেলি

4

এই কাজ করা উচিত

find . -maxdepth 1 -type d -name '.git' -exec sh -c 'cd "{}" && pwd && git pull' \;

-maxdepth 1পতাকাটি সরিয়ে ফেলা , এটি কেবলমাত্র একমাত্র কমান্ড যা আমি অনুসন্ধান এবং প্রচুর চেষ্টা করে খুঁজে পেয়েছি যা একটি আদেশ পুনরাবৃত্তভাবে কার্যকর করে (সমস্ত উপ-ডিরেক্টরিতে, কেবল ডিরেক্টরিগুলি এক স্তর নীচে নয়)।
r_alex_hall

0

এটা করতে recursive ব্যবহার না করেই findকিন্তুforloop

for dir in ~/projects/git/*/*/; do (cd "$dir" && git pull); done
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.