গিট ডিফ বলে সাবপ্রজেক্টটি নোংরা


227

আমি সবেমাত্র গিট ডিফ চালিয়েছি এবং আমার প্রায় 10 টি সাবমডিউলগুলির জন্য নিম্নোক্ত আউটপুটটি পাচ্ছি

diff --git a/.vim/bundle/bufexplorer b/.vim/bundle/bufexplorer
--- a/.vim/bundle/bufexplorer
+++ b/.vim/bundle/bufexplorer
@@ -1 +1 @@
-Subproject commit 8c75e65b647238febd0257658b150f717a136359
+Subproject commit 8c75e65b647238febd0257658b150f717a136359-dirty

এটার মানে কি? আমি কীভাবে এটি ঠিক করব?

উত্তর:


268

মার্ক লংগায়ারের ব্লগ পোস্ট গিট সাবমোডিয়ুলস বর্ণিত হিসাবে উল্লেখ করা হয়েছে ,

গিটারের ১.7.০ সংস্করণ এবং পরবর্তী সময়ে গিট সাবমডিউলের আচরণে বিরক্তিকর পরিবর্তন রয়েছে।
সাবমডিউলগুলিকে এখন নোংরা হিসাবে গণ্য করা হয় যদি তাদের কাছে কোনও সংশোধিত ফাইল বা চিহ্নবিহীন ফাইল থাকে তবে পূর্ববর্তী ক্ষেত্রে এটি কেবল তখনই ঘটত যদি সাবমোডুলের হেড ভুল প্রতিশ্রুতি দেখায়

+গিট সাবমোডিয়ুলের আউটপুটে প্লাস সাইন ( ) এর অর্থ পরিবর্তিত হয়েছে এবং আপনি যখন প্রথমবারের মতো এসেছেন তখন কী ভুল হচ্ছে তা নির্ধারণ করতে কিছুটা সময় লাগে, উদাহরণস্বরূপ চেঞ্জলগগুলি দেখে বা গিটের উপর গিট বিস্কেপ্ট ব্যবহার করে .git পরিবর্তনটি সন্ধান করুন। ব্যবহারকারীদের জন্য "নির্দিষ্ট সংস্করণে, তবে নোংরা" এর জন্য একটি আলাদা প্রতীক প্রবর্তন করা অনেক দয়ালু হত।

আপনি এটি দ্বারা এটি ঠিক করতে পারেন:

  • হয় আপনার প্রতিটি সাবমোডিয়ুলের মধ্যে পরিবর্তন / বিবর্তনগুলি প্রতিশ্রুতিবদ্ধ বা পূর্বাবস্থায় ফিরার আগে, পূর্বে রেপোতে ফিরে যাওয়ার আগে (যেখানে ডিফের পক্ষে "নোংরা" ফাইলগুলি রিপোর্ট করা উচিত নয়) und আপনার সাবমডিউলে থাকা সমস্ত পরিবর্তনগুলি কেবল আপনার সাবমোডিয়ুলের cdমূল ডিরেক্টরিতে পূর্বাবস্থায় ফেরানোর জন্য এবং করুনgit checkout .

    ডটনেট কার্পেন্টার মন্তব্য করেছে যে আপনি এটি করতে পারেন:git submodule foreach --recursive git checkout .

  • বা --ignore-submodulesআপনার যুক্ত করুন git diff, অস্থায়ীভাবে সেই "নোংরা" সাবমডিউলগুলিকে উপেক্ষা করার জন্য।

গিট সংস্করণে নতুন 1.7.2

নোমের নীচের মন্তব্য হিসাবে , এই প্রশ্নের উল্লেখ রয়েছে যে, গিট সংস্করণ ১. version.২ থেকে আপনি নোংরা সাবমডিউলগুলি এটিকে উপেক্ষা করতে পারবেন:

git status --ignore-submodules=dirty

2
জেনে রাখা ভাল জিনিস: আপনি git commit -aএই পরিবর্তনগুলি যুক্ত করেও চিন্তা না করেই চালিয়ে দিতে পারেন। যদিও তাদের Mসামনের দিকে চিহ্নিত করা হয়েছে, তারা আপনার প্রতিশ্রুতি দিয়ে শেষ করবে না।
গীতারিক

1
আমার জন্য, আমাকে প্রতিটি নোংরা সাবমডিউলে গিয়ে চালাতে হয়েছিল git clean -id
জিডিপি 2

1
@ জিডিপি 2 যা আপনি এক লাইনে ডোন করতে পারেন git submodule foreach --recursive git clean -id(এর সাথে প্রথমে ব্যাকআপ
রেপোতে

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

21

এছাড়াও সাবমডিউলটি সরানো এবং তারপরে দৌড়ানো git submodule initএবং git submodule updateস্পষ্টতই কৌশলটি সম্পাদন করবে তবে সর্বদা উপযুক্ত বা সম্ভব নাও হতে পারে।


1
এটি আমার পক্ষে কাজ করেছিল যখন আমি কিছু বিদ্যমান ফোল্ডারগুলিকে সাবমোডিয়ালে রূপান্তরিত করেছি এবং তারপরে অন্য কোনও মেশিনে টানলাম যা এখনও পুরাতন ফোল্ডারগুলিতে ছিল।
রজার লিপসক্বে

18

যে কোনও সাবমডিউলে থাকা সমস্ত চিহ্নবিহীন ফাইলগুলিকে উপেক্ষা করতে নিম্নলিখিত পরিবর্তনগুলি উপেক্ষা করার জন্য নিম্নলিখিত কমান্ডটি ব্যবহার করুন।

git config --global diff.ignoreSubmodules dirty

এটি আপনার স্থানীয় গিট কনফিগারেশনে নিম্নলিখিত কনফিগারেশন বিকল্পটি যুক্ত করবে:

[diff]
  ignoreSubmodules = dirty

আরও তথ্য এখানে পাওয়া যাবে


16

সম্পাদনা : এই উত্তরটি (এবং অন্যান্য বেশিরভাগ) অপ্রচলিত; পরিবর্তে দেবপুলের উত্তর দেখুন ।


মূলত, " git diff --ignore-submodules" এবং " git status --ignore-submodules" বিশ্বব্যাপী ডিফল্ট করার জন্য কোনও কনফিগার বিকল্প ছিল না (তবে কমান্ডগুলিতে গিট ডিফল্ট পতাকা সেট করাও দেখুন )। বিকল্পটি হ'ল আপনি যে ignoreপ্রতিটি স্বতন্ত্র সাবমোডিয়ুলকে উপেক্ষা করতে চান (উভয় git diffএবং উভয়ের জন্য git status) .git/configফাইলটিকে (কেবল স্থানীয়) বা .gitmodules(গিট দ্বারা সংস্করণিত করা হবে ) একটি ডিফল্ট কনফিগারেশন বিকল্প সেট করা । উদাহরণ স্বরূপ:

[submodule "foobar"]
    url = git@bitbucket.org:foo/bar.git
    ignore = untracked

ignore = untrackedকেবল অপ্রত্যাশিত ফাইলগুলিকে ignore = dirtyঅগ্রাহ্য করা, পরিবর্তিত ফাইলগুলিকেও উপেক্ষা করা এবং ignore = allএছাড়াও প্রতিশ্রুতিবদ্ধ উপেক্ষা করা। দৃশ্যত সমস্ত সাবমডিউলের জন্য এটি ওয়াইল্ডকার্ড করার কোনও উপায় নেই।


13

এটি কেস কারণ সাবমডিউডের জন্য আপনার কাছে থাকা পয়েন্টারটি আসলে সাবমডিউল ডিরেক্টরিতে নেই। এটি ঠিক করতে, আপনাকে অবশ্যই git submodule updateআবার চালাতে হবে :


9
git submodule foreach --recursive git checkout .

এটি আমার জন্য কৌশলটি করেনি তবে এটি আমাকে ফাইলগুলির একটি তালিকা দিয়েছে (আমার ক্ষেত্রে কেবলমাত্র একটি) যা সাবমডিউলে পরিবর্তিত হয়েছিল (আমাকে সেখানে কিছুই না করে)।

সুতরাং আমি সাবমোডিয়ুলের দিকে যেতে পারি এবং গিটের স্থিতিটি আমাকে দেখিয়েছিল যে আমার হেড বিচ্ছিন্ন ছিল -> গিট চেকআউট মাস্টার, গিট স্ট্যাটাসটি আবারও পরিবর্তিত ফাইলটি দেখতে, গিট চেকআউট> ফাইলের নাম <, গিট টান এবং সবকিছু ঠিক আছে।


9

আমি সাবমডিউল ডিরেক্টরিটি সরিয়ে এবং আবার এটি শুরু করে শেষ করেছি

cd my-submodule
git push
cd ../
rm -rf my-submodule
git submodule init
git submodule update

4
আমি বরং যা বুঝতে পেরেছি তা বুঝতে পেরেছি, তবে
এটিই

6

ফাইলমোড সেটিংস সক্ষম থাকলে এবং আপনি সাবমডিউল সাবট্রিতে ফাইলের অনুমতি পরিবর্তন করে থাকলে একটি সাবমোডিয়ুলটি নোংরা হিসাবে চিহ্নিত করা যেতে পারে।

সাবমডিউলে ফাইলমোড অক্ষম করতে আপনি /.git/modules/path/to/your/submodule/config এডিট করে যোগ করতে পারেন

[core]
  filemode = false

আপনি যদি সমস্ত নোংরা পরিস্থিতি উপেক্ষা করতে চান, আপনি হয় /.git মডুলস ফাইলে ignore = dirtyসম্পত্তি সেট করতে পারেন তবে আমার মনে হয় কেবল ফাইলমোড অক্ষম করা ভাল।


1

আমার ক্ষেত্রে আমি নিশ্চিত ছিলাম না যে এটি কী কারণে ঘটেছে, তবে আমি জানতাম যে আমি কেবল সাবমডিউলগুলি তাদের সর্বশেষ দূরবর্তী প্রতিশ্রুতিতে পুনরায় সেট করা এবং এটি দিয়ে সম্পন্ন করা চাই। এর সাথে এখানে বিভিন্ন প্রশ্নের কয়েকটির উত্তর একত্রিত করা জড়িত:

git submodule update --recursive --remote --init

সূত্র:

আমি কীভাবে আমার পরিবর্তনগুলি গিট সাবমোডিয়ালে ফিরিয়ে আনব?

সমস্ত গিট সাবমোডিয়ুলের সর্বশেষতম টানার সহজ উপায়

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