গিটের সাথে একটি নোংরা সূচক বা তালাবিহীন ফাইলগুলি অনুসন্ধান করা হচ্ছে


243

আমার গিট সংগ্রহস্থলে আমার কোনও আপত্তিজনক পরিবর্তন আছে কিনা তা আমি কীভাবে পরীক্ষা করতে পারি:

  1. পরিবর্তনগুলি সূচকে যুক্ত হয়েছে তবে প্রতিশ্রুতিবদ্ধ নয়
  2. ফাইলবিহীন ফাইল

স্ক্রিপ্ট থেকে?

git-status গিট সংস্করণ 1.6.4.2 সহ সর্বদা শূন্য ফিরে আসে বলে মনে হয়।


3
স্টেস্টেড না পরিবর্তিত ফাইল থাকলে গিটের স্থিতি 1 ফিরে আসবে। তবে সাধারণভাবে, আমি দেখতে পেলাম যে গিট সরঞ্জামগুলি রিটার্নের স্ট্যাটাসের সাথে বিশেষভাবে পুরোপুরি নয়। ইজি গিট ডিফ পার্থক্য রয়েছে কিনা তা 0 প্রদান করে।
প্রেরণা

11
@ বিদ্রূপিত: diffকমান্ডটি সফলভাবে চালানোর পরিবর্তে আপনার যদি পার্থক্যের উপস্থিতি বা অনুপস্থিতি নির্দেশ করতে হয় তবে আপনার প্রয়োজন --exit-codeবা ব্যবহার করতে হবে --quiet। কমান্ডের সাফল্য নির্দেশ করতে গিট কমান্ডগুলি শূন্য বা অ-শূন্য বহির্গমন কোডটি ফেরত দেওয়ার সাথে খুব সামঞ্জস্যপূর্ণ।
সিবি বেইলি

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

1
রবার্ট - এটি সম্প্রদায়ের জন্য একটি খুব বিভ্রান্তিকর বিষয় (এটি কোনওভাবেই সহায়তা করে না যে 'চীনামাটির বাসন' বিভিন্ন প্রসঙ্গে আলাদাভাবে ব্যবহৃত হয়)। আপনি যে উত্তরটি নির্বাচন করেছেন তা 2.5x গুণ বেশি ভোটের জবাব উপেক্ষা করে যা আরও দৃ rob় এবং গিট ডিজাইনের অনুসরণ করে। আপনি কি ক্রিস জবাবটি দেখেছেন?
মাইক 21

1
@ রবার্ট - আমি আশা করছি আপনি আপনার গৃহীত উত্তর পরিবর্তন করার বিষয়ে বিবেচনা করতে পারেন। আপনি যেটিকে নির্বাচন করেছেন তিনি আরও ভঙ্গুর গিট 'চীনামাটির বাসন' আদেশের উপর নির্ভর করে; আসল সঠিক উত্তর ( 2x আপভোটগুলির সাথেও) সঠিক গিট 'নদীর গভীরতানির্ণয়' কমান্ডের উপর নির্ভর করে। সেই সঠিক উত্তরটি মূলত ক্রিস জনসেনই পেয়েছিলেন। আমি আজ এটিকে তৃতীয়বারের মতো এই পৃষ্ঠায় রেফারেন্স হিসাবে নিয়ে এসেছি, তবে আমি কেবল উত্তরটির দিকে ইঙ্গিত করতে পারি না, কেন আমি স্বীকৃত উত্তরটি সাব-অনুকূল / সীমান্তরেখা ভুল বলে ব্যাখ্যা করেছি। ধন্যবাদ!
মাইকে

উত্তর:


173

দুর্দান্ত সময়! আমি কিছুদিন আগে ঠিক এই সম্পর্কে একটি ব্লগ পোস্ট লিখেছিলাম, যখন আমি বুঝতে পারি কীভাবে আমার প্রম্পটে গিটের স্থিতির তথ্য যুক্ত করতে হয়।

আমি যা করি তা এখানে:

  1. নোংরা স্ট্যাটাসের জন্য:

    # Returns "*" if the current git branch is dirty.
    function evil_git_dirty {
      [[ $(git diff --shortstat 2> /dev/null | tail -n1) != "" ]] && echo "*"
    }
  2. ট্রেড না করা ফাইলগুলির জন্য ( --porcelainপতাকাটি লক্ষ্য করুন git statusযা আপনাকে সুন্দর পার্স-সক্ষম আউটপুট দেয়):

    # Returns the number of untracked files
    
    function evil_git_num_untracked_files {
      expr `git status --porcelain 2>/dev/null| grep "^??" | wc -l` 
    }

যদিও git diff --shortstatআরও সুবিধাজনক তবে আপনি git status --porcelainনোংরা ফাইল পাওয়ার জন্য ব্যবহার করতে পারেন :

# Get number of files added to the index (but uncommitted)
expr $(git status --porcelain 2>/dev/null| grep "^M" | wc -l)

# Get number of files that are uncommitted and not added
expr $(git status --porcelain 2>/dev/null| grep "^ M" | wc -l)

# Get number of total uncommited files
expr $(git status --porcelain 2>/dev/null| egrep "^(M| M)" | wc -l)

দ্রষ্টব্য: 2>/dev/nullত্রুটি বার্তাগুলি ফিল্টার করে যাতে আপনি নন-গিট ডিরেক্টরিতে এই আদেশগুলি ব্যবহার করতে পারেন। (তারা কেবল 0ফাইল গণনার জন্য ফিরে আসবে ))

সম্পাদনা করুন :

পোস্টগুলি এখানে:

আপনার টার্মিনাল প্রম্পটে গিট স্থিতির তথ্য যুক্ত করা হচ্ছে

উন্নত গিট-সক্ষম শেল প্রম্পট


8
এটি লক্ষণীয় যে গিট ব্যাশের সমাপ্তি আপনার প্রম্পট দিয়ে যা করছেন তা বেশ কিছু করার জন্য শেল ফাংশন নিয়ে আসে - __git_ps1। এটি শাখার নামগুলি দেখায়, বিশেষ করে চিকিত্সা সহ আপনি যদি পুনর্বাসনের প্রক্রিয়া, am-প্রয়োগ, মার্জ বা দ্বিখণ্ডিত প্রক্রিয়ায় থাকেন। এবং আপনি GIT_PS1_SHOWDIRTYSTATEঅস্থায়ী পরিবর্তনের জন্য একটি তারকাচিহ্ন পেতে এবং মঞ্চ পরিবর্তনের জন্য প্লাস্টিকের পরিবর্তনশীল সেট করতে পারেন । (আমি মনে করি আপনি এটি চিহ্নবিহীন ফাইলগুলি নির্দেশ করতে এবং কিছু git-describeআউটপুট দিতেও পেতে পারেন )
ক্যাসাবেল

8
একটি সতর্কতা: git diff --shortstatযদি পরিবর্তনগুলি ইতিমধ্যে সূচকে থাকে তবে একটি মিথ্যা নেতিবাচক দিকটি দেয়।
মার্কো টপলনিক

4
git status --porcelainপছন্দনীয়, কারণ git diff --shortstatসদ্য নির্মিত খালি ফাইলগুলি ধরবে না। আপনি এটি কোনও পরিষ্কার পরিচ্ছন্ন গাছে চেষ্টা করতে পারেন:touch foo && git diff --shortstat
ক্যাম্পাড্রেনালিন

7
না - চীনামাটির বাসন মানে আউটপুট মানুষের জন্য এবং সহজেই ব্রেক হয়ে যায় !! @ ক্রিস জনসনের উত্তর দেখুন, যা সঠিকভাবে স্থিতিশীল, স্ক্রিপ্ট-বান্ধব বিকল্পগুলি ব্যবহার করে।
মাইক 21

7
চীনামাটির বাসন বিকল্পটি সম্পর্কে গিট-স্ট্যাটাস ম্যান পৃষ্ঠা থেকে @ মাইক করুন: "স্ক্রিপ্টগুলির জন্য আউটপুটটিকে সহজে-পার্সে ফর্ম্যাটে দিন This এটি সংক্ষিপ্ত আউটপুটের মতো, তবে গিট সংস্করণ জুড়ে স্থিতিশীল থাকবে এবং ব্যবহারকারী কনফিগারেশন নির্বিশেষে। "
itadok

399

গিটারকে নির্ভরযোগ্যভাবে "স্ক্রিপ্টিং" এর মূল কী হ'ল 'প্লাম্বিং' কমান্ড ব্যবহার করা।

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

দুর্ভাগ্যক্রমে 'প্রতিদিনের' গিট কমান্ডগুলি হ'ল 'চীনামাটির বাসন' কমান্ড, সুতরাং বেশিরভাগ গিট ব্যবহারকারী নদীর গভীরতানির্ণয় আদেশের সাথে পরিচিত নাও হতে পারেন। চীনামাটির বাসন এবং নদীর গভীরতানির্ণয় কমান্ডের মধ্যে পার্থক্যটি মূল গিট ম্যানপেজে তৈরি করা হয় ( উচ্চ-স্তরের কমান্ড (চীনামাটির বাসন) এবং নিম্ন-স্তরের কমান্ড (নদীর গভীরতানির্ণয়) শীর্ষক সাব-বিভাগগুলি দেখুন ।


নিরবিচ্ছিন্ন পরিবর্তনগুলি সম্পর্কে সন্ধানের জন্য আপনার সম্ভবত git diff-indexঅন্য কিছু গাছের (যেমন উদ্যানের) তুলনায় সূচক (এবং কার্যক্ষম গাছের ট্র্যাক বিট HEAD) git diff-filesতুলনা করতে হবে, সম্ভবত git ls-files( সূচীর বিপরীতে কর্মক্ষম গাছের তুলনা করুন), এবং সম্ভবত (তালিকার ফাইলগুলি; উদাহরণস্বরূপ তালিকুক্ত না হওয়া) , অচিভুক্ত ফাইলগুলি)।

(নোট করুন যে নীচের কমান্ডগুলিতে HEAD --পরিবর্তে ব্যবহৃত হবে HEADকারণ অন্যথায় কোনও ফাইলের নাম থাকলে কমান্ডটি ব্যর্থ হয় HEAD।)

কোনও সংগ্রহস্থল পরিবর্তনের মঞ্চস্থ হয়েছে কিনা তা পরীক্ষা করতে (এখনও প্রতিশ্রুতিবদ্ধ নয়) এটি ব্যবহার করুন:

git diff-index --quiet --cached HEAD --
  • যদি এটির সাথে প্রস্থান হয় 0তবে কোনও পার্থক্য ছিল না ( 1অর্থাত্ পার্থক্য ছিল)।

কোনও কার্যনির্বাহী গাছের মঞ্চস্থ পরিবর্তন হতে পারে কিনা তা পরীক্ষা করতে:

git diff-files --quiet
  • প্রস্থান কোডটি git diff-index( 0== কোনও পার্থক্য নয়; 1== পার্থক্য) এর সমান ।

কার্যনির্বাহী গাছের সূচক এবং ট্র্যাক করা ফাইলগুলির সংমিশ্রণের সাথে সম্পর্কিত পরিবর্তন রয়েছে কিনা তা পরীক্ষা করতে HEAD:

git diff-index --quiet HEAD --
  • এটি আগের দুজনের সংমিশ্রণের মতো। একটি প্রধান পার্থক্য হ'ল এটি এখনও কোনও "কোনও পার্থক্য নয়" প্রতিবেদন করবে যদি আপনার যদি পর্যায়ক্রমে পরিবর্তন হয় যে আপনি কার্যনির্বাহী গাছের মধ্যে "পূর্বাবস্থায় ফিরে এসেছেন" (যে বিষয়বস্তুগুলিতে ফিরে এসেছেন HEAD)। এই একই পরিস্থিতিতে, দুটি পৃথক কমান্ড উভয়ই "পার্থক্য উপস্থিত রয়েছে" এর রিপোর্ট ফিরিয়ে দেবে।

আপনি অচিহ্নযুক্ত ফাইলগুলি উল্লেখ করেছেন। আপনার অর্থ হতে পারে "আনট্র্যাকড এবং অযৌক্তিকর", বা আপনার অর্থ কেবল সরল "অচিহ্নযুক্ত" (উপেক্ষা করা ফাইলগুলি সহ) হতে পারে। যে কোনও উপায়ে, git ls-filesকাজের জন্য হাতিয়ার:

“চিহ্নবিহীন” জন্য (উপস্থিত থাকলে উপেক্ষা করা ফাইল অন্তর্ভুক্ত থাকবে):

git ls-files --others

"চিহ্নবিহীন এবং অযৌক্তিকর" জন্য:

git ls-files --exclude-standard --others

আমার প্রথম চিন্তাটি কেবল এই কমান্ডগুলির আউটপুট রয়েছে কিনা তা যাচাই করা হবে:

test -z "$(git ls-files --others)"
  • যদি এটির সাথে প্রস্থান হয় 0তবে সেখানে কোনও আন-ল্যাক করা ফাইল নেই। যদি এটির সাথে প্রস্থান হয় 1তবে তালিবদ্ধ ফাইল রয়েছে।

একটি ছোট্ট সম্ভাবনা রয়েছে যে এটি অস্বাভাবিক প্রস্থানগুলি থেকে git ls-files"কোনও চিহ্নবিহীন ফাইল নয়" রিপোর্টগুলিতে অনুবাদ করবে (উভয়ই উপরের কমান্ডের শূন্য-বহির্গমন হতে পারে)। কিছুটা বেশি শক্তিশালী সংস্করণটি এর মতো দেখতে পারে:

u="$(git ls-files --others)" && test -z "$u"
  • ধারণাটি আগের কমান্ডের সমান, তবে এটি অপ্রত্যাশিত ত্রুটিগুলি git ls-filesপ্রচার করতে দেয়। এক্ষেত্রে শূন্য-বহির্গমন প্রস্থানটির অর্থ হতে পারে "সেখানে তালিকৃত ফাইল রয়েছে" বা এর অর্থ একটি ত্রুটি ঘটেছে। আপনি যদি এর পরিবর্তে "কোনও চিহ্নবিহীন ফাইলগুলি" ফলাফলের সাথে মিলিত "ত্রুটি" ফলাফলগুলি চান তবে ব্যবহার করুন test -n "$u"(যেখানে 0"কিছু চিহ্নবিহীন ফাইলগুলি" এর প্রস্থান করার অর্থ, এবং নন-শূন্যের অর্থ ত্রুটি বা "কোনও চিহ্নবিহীন ফাইল নয়") ব্যবহার করুন।

অন্য ধারণাটি হ'ল --error-unmatchযখন কোনও তালিকার চিহ্নবিহীন ফাইল নেই তখন একটি শূন্য-বহির্গমন প্রস্থান করতে ব্যবহার করা। এটি "কোনও ত্রুটিযুক্ত ফাইল নেই" (প্রস্থান 1) "একটি ত্রুটি ঘটেছে" (শূন্য- বহিরাগত , তবে সম্ভবত 128) থেকে বেরিয়ে আসার ঝুঁকিও চালায় । তবে 0বনাম বনাম 1বনাম শূন্য-বহির্গমন কোডগুলি পরীক্ষা করা সম্ভবত যথেষ্ট শক্তিশালী:

git ls-files --others --error-unmatch . >/dev/null 2>&1; ec=$?
if test "$ec" = 0; then
    echo some untracked files
elif test "$ec" = 1; then
    echo no untracked files
else
    echo error from ls-files
fi

উপরের যে কোনও git ls-filesউদাহরণ গ্রহণ করতে পারে --exclude-standardযদি আপনি কেবল অচিহ্নযুক্ত এবং অচিভুক্ত ফাইলই বিবেচনা করতে চান।


5
আমি এটি উল্লেখ করতে চাই যে git ls-files --othersএটি স্থানীয় অপ্রত্যাশিত ফাইল দেয় , যখন git status --porcelainস্বীকৃত উত্তরের উত্তরটি গিট রিপোজিটরির আওতায় থাকা সমস্ত অপ্রকাশিত ফাইল দেয়। আমি আসল পোস্টারগুলির মধ্যে কোনটি চেয়েছিলাম তা নয় তবে উভয়ের মধ্যে পার্থক্যটি আকর্ষণীয়।
এরিক হে লেবিগোট

1
@ ফুনেহে: আপনাকে একটি প্যাথস্পেক সরবরাহ করতে হবে --error-unmatch। চেষ্টা করুন (উদাঃ) git ls-files --other --error-unmatch --exclude-standard .(পেছনের সময় নোট করুন, এটি সিডব্লিউডকে বোঝায়; এটি কার্যকারী গাছের শীর্ষ স্তরের ডিরেক্টরি থেকে চালান)।
ক্রিস জনসন

8
@ পিএইফএস: অমিল স্ট্যাটের (2) তথ্যের কারণে কিছু "ভ্রান্ত ইতিবাচক" এড়ানোর git update-index -q --refreshজন্য diff-indexআপনাকে আগে করতে হবে ।
ক্রিস জনসন

1
প্রয়োজনে আমাকে কামড়েছে git update-index! কোনও কিছু পরিবর্তন না করে যদি ফাইলগুলিকে স্পর্শ করে তবে এটি গুরুত্বপূর্ণ।
নেকিডেবল

2
@ রবার্টসিমার "স্থানীয়" দ্বারা আমি আপনার বর্তমান ডিরেক্টরিতে থাকা ফাইলগুলি বোঝাতে চাইছি যা এটির মূল গিট সংগ্রহস্থলের নীচে থাকতে পারে । --porcelainসমাধান তালিকা সব untracked ফাইল পাওয়া পুরো Git সংগ্রহস্থলের (বিয়োগ Git উপেক্ষা-ফাইল), এমনকি যদি আপনি তার সাবডিরেক্টরি এক ভিতরে আছে।
এরিক হে লেবিগোট

139

ধরে নিচ্ছি আপনি গিট ১.7.০ বা তার পরে আছেন ...

এই পৃষ্ঠায় সমস্ত উত্তর এবং কিছু পরীক্ষা-নিরীক্ষার পরে, আমি মনে করি যে পদ্ধতিটি সঠিকতা এবং সংকোচনের সঠিক সমন্বয়কে হিট করে:

test -n "$(git status --porcelain)"

যদিও গিট ট্র্যাকড, এড়ানো, অবরুদ্ধ, অনার্যাকড কিন্তু অযৌক্তিক, এবং এমন কিছুর মধ্যে অনেক উপকারের অনুমতি দেয়, আমি বিশ্বাস করি যে সাধারণ ব্যবহারের ক্ষেত্রটি বিল্ড স্ক্রিপ্টগুলি স্বয়ংক্রিয় করার জন্য, যেখানে আপনার চেকআউটটি পরিষ্কার না হলে আপনি সবকিছু থামাতে চান।

সেক্ষেত্রে প্রোগ্রামারটি কী করবে তা অনুকরণ করে বোঝায়: টাইপ git statusকরে আউটপুটটি দেখুন look তবে আমরা প্রদর্শিত নির্দিষ্ট শব্দগুলির উপর নির্ভর করতে চাই না, তাই আমরা --porcelain1.7.0 তে প্রবর্তিত মোডটি ব্যবহার করি; যখন সক্ষম হয়, একটি পরিষ্কার ডিরেক্টরি কোনও আউটপুট দেয় না।

তারপরে আমরা test -nকোনও আউটপুট ছিল কিনা তা দেখতে ব্যবহার করি ।

এই কমান্ডটি যদি ডিরেক্টরিটি পরিশ্রমী ডিরেক্টরি পরিষ্কার থাকে এবং 1 টি পরিবর্তন করে থাকে তবে প্রতিশ্রুতিবদ্ধ হবে return আপনি পরিবর্তন করতে পারেন -nএকটি থেকে -zআপনি বিপরীত চাই। এটি কোনও স্ক্রিপ্টের কমান্ডে শৃঙ্খলাবদ্ধ করার জন্য দরকারী। উদাহরণ স্বরূপ:

test -z "$(git status --porcelain)" || red-alert "UNCLEAN UNCLEAN"

এটি কার্যকরভাবে বলেছে "হয় কোনও পরিবর্তন করার দরকার নেই বা অ্যালার্ম সেট আপ করা হয় না"; আপনি লিখছেন যে স্ক্রিপ্টের উপর নির্ভর করে এই ওয়ান-লাইনারটি যদি একটি বিবৃতিতে পছন্দ করে।


1
আমার জন্য অন্য সমস্ত কমান্ড লিনাক্স এবং উইন্ডোজের মধ্যে একই প্রতিনিধিত্বের উপর বিভিন্ন ফলাফল দিচ্ছিল। এই কমান্ড উভয় ক্ষেত্রেই আমাকে একই আউটপুট দিয়েছে।
আদর্শ

6
এই প্রশ্নের উত্তর দেওয়ার জন্য এবং আপনাকে ক্রমাগত ঝাঁকুনি না দেওয়ার জন্য ধন্যবাদ, কখনই একটি পরিষ্কার উত্তর প্রদান করে না।
NateS

একটি ম্যানুয়াল ডিপ্লোয়মেন্ট স্ক্রিপ্টের জন্য, test -n "$(git diff origin/$branch)"
এটির


8

এর মধ্যে কয়েকটি জবাবটি দেখুন ... (এবং * নিক্স এবং উইন্ডোজগুলিতে আমার বিভিন্ন সমস্যা ছিল যা আমার প্রয়োজন ছিল) ... নিম্নলিখিতটি খুব ভালভাবে কাজ করেছে ...

git diff --no-ext-diff --quiet --exit-code

* নিক্সের প্রস্থান কোডটি পরীক্ষা করতে

echo $?   
#returns 1 if the repo has changes (0 if clean)

উইন্ডোতে প্রস্থান কোডটি পরীক্ষা করতে $

echo %errorlevel% 
#returns 1 if the repos has changes (0 if clean) 

থেকে Sourced https://github.com/sindresorhus/pure/issues/115 ভাগ করে নেওয়ার জন্য যে পোস্টে @paulirish ধন্যবাদ


4

git statusএকটি স্ক্রিপ্ট যা কেন encapsulate না :

  • এই কমান্ডের আউটপুট বিশ্লেষণ করবে
  • আপনার প্রয়োজনের ভিত্তিতে উপযুক্ত ত্রুটি কোডটি ফিরিয়ে দেবে

এইভাবে, আপনি আপনার স্ক্রিপ্টে সেই 'বর্ধিত' স্থিতিটি ব্যবহার করতে পারেন।


হিসাবে 0xfe তার উল্লেখ করেছে চমৎকার উত্তর , git status --porcelainকোন স্ক্রিপ্ট ভিত্তিক সমাধান যান্ত্রিক হয়

--porcelain

স্ক্রিপ্টগুলির জন্য আউটপুটটিকে একটি স্থিতিশীল, সহজে-পার্সে ফর্ম্যাটটিতে দিন।
বর্তমানে এটি অভিন্ন --short output, তবে এটি স্ক্রিপ্টগুলির জন্য নিরাপদ করে ভবিষ্যতে পরিবর্তন না করার গ্যারান্টিযুক্ত।


কারণ আমি অলস, সম্ভবত। আমি ভেবেছিলাম এটির জন্য একটি বিল্ট-ইন রয়েছে, কারণ এটি দেখতে বেশ সুন্দর ব্যবহারের ক্ষেত্রে মনে হচ্ছে।
রবার্ট মুন্তানু

আমি আপনার পরামর্শের ভিত্তিতে একটি সমাধান পোস্ট করেছি, যদিও আমি এটির সাথে অত্যন্ত সন্তুষ্ট নই।
রবার্ট মুন্তানু

4

একটি DIY সম্ভাবনা, 0xfe এর পরামর্শ অনুসরণ করতে আপডেট করা

#!/bin/sh
exit $(git status --porcelain | wc -l) 

ক্রিস জনসন দ্বারা উল্লিখিত হিসাবে , এটি কেবল গিট 1.7.0 বা আরও নতুনতে কাজ করে।


6
এটির সাথে সমস্যাটি হ'ল আপনি ভবিষ্যতের সংস্করণগুলিতে 'ওয়ার্কিং ডিরেক্টরি পরিষ্কার' স্ট্রিংটি নির্ভরযোগ্যভাবে আশা করতে পারবেন না। - পোরস্লেইন পতাকাটি পার্সিংয়ের জন্য ছিল, সুতরাং এর থেকে আরও ভাল সমাধান হ'ল: প্রস্থান করুন g (গিট স্ট্যাটাস - পোরস্লেইন |
ডাব্লুসিএল

@ 0xfe - --porcelainপতাকাটি কখন যুক্ত করা হয়েছিল জানেন ? 1.6.4.2 দিয়ে কাজ করে না।
রবার্ট মুন্তানু

@ রবার্ট: git status --shortতাহলে চেষ্টা করুন ।
ভনসি

3
git status --porcelainএবং git status --shortউভয়ই 1.7.0 এ চালু হয়েছিল। ভবিষ্যতে এটির বিন্যাস পরিবর্তিত --porcelainকরার জন্য এটি বিশেষভাবে চালু করা হয়েছিল git status --short। সুতরাং, git status --shortএকই সমস্যা ভুগবে git status(আউটপুট যে কোনও সময়ে পরিবর্তন হতে পারে যেহেতু এটি 'নদীর গভীরতানির্ণয়' আদেশ নয়)।
ক্রিস জনসেন

@ ক্রিস, পটভূমি তথ্যের জন্য ধন্যবাদ। গিট 1.7.0 হিসাবে এটি করার সর্বোত্তম উপায় প্রতিফলিত করার জন্য আমি উত্তর আপডেট করেছি।
রবার্ট মুন্তানু

2

আমার প্রায়শই একটি বিল্ড ব্যর্থ করার একটি সহজ উপায়ের প্রয়োজন ছিল যদি মৃত্যুদন্ড কার্যকর হওয়ার পরে কোনও ট্রান্সফাইড ট্র্যাক করা ফাইল বা কোনও আন-ল্যাক ফাইল নেই যা উপেক্ষা করা হয় না।

এটি এড়ানোর জন্য এটি বেশ গুরুত্বপূর্ণ যেখানে বামফুট উত্পাদন করে।

এখনও অবধি, সেরা কমান্ডটি দেখে মনে হচ্ছে এটি শেষ হয়েছে:

 test -z "$(git status --porcelain | tee /dev/fd/2)" || \
     {{ echo "ERROR: git unclean at the end, failing build." && return 1 }}

এটি কিছুটা জটিল দেখাতে পারে এবং আমি যদি কেউ পছন্দসই আচরণ বজায় রাখে এমন কোনও সংক্ষিপ্ত রূপটি পাই তবে আমি প্রশংসা করব:

  • এমনকি যদি কিছু করা যায় না তবে আউটপুট এবং স্যাকসেসের প্রস্থান কোড নেই
  • প্রস্থান কোড 1 এটি ব্যর্থ হলে
  • স্টারারে ত্রুটি বার্তা ব্যাখ্যা করে কেন এটি ব্যর্থ হয়
  • ব্যর্থতার কারণী ফাইলগুলির তালিকা প্রদর্শন করুন, আবার স্ট্ডার।

2

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

        set -eu

        u="$(git ls-files --others)"
        if ! git diff-index --name-only --quiet HEAD -- || [ -z "${u:-}" ]; then
            dirty="-dirty"
        fi

সেট-ই বা সমতুল্য ব্যবহার করে যখন নির্বাহ না করা হয়, আমরা পরিবর্তে একটি করতে পারি u="$(git ls-files --others)" || exit 1(বা যদি এটি কোনও ব্যবহৃত ফাংশনের জন্য কাজ করে তবে ফিরে আসতে পারেন)

কমান্ডটি যথাযথভাবে সাফল্য লাভ করতে পারে তাই আনট্র্যাকড_ফাইলগুলি সেট করা আছে।

এর পরে, আমরা উভয় বৈশিষ্ট্য যাচাই করতে পারি এবং একটি ভেরিয়েবল (বা যাই হোক না কেন) সেট করতে পারি।


1

ভাণ্ডারটিতে কোনও আন-ল্যাক করা ফাইল রয়েছে কিনা তা অনুসন্ধানের জন্য এটি আরও শেল বান্ধব প্রকরণ :

# Works in bash and zsh
if [[ "$(git status --porcelain 2>/dev/null)" = *\?\?* ]]; then
  echo untracked files
fi

এটি দ্বিতীয় প্রক্রিয়াটি কাঁটাচামচ করে না grep, এবং আপনি গিট সংগ্রহস্থলে আছেন কিনা তা পরীক্ষা করার প্রয়োজন নেই। যা শেল প্রম্পট ইত্যাদির পক্ষে কার্যকর etc.


1

আপনি করতে পারেন

git describe --dirty

। এটি একটি নোংরা কাজকারী গাছ সনাক্ত করে তবে এটি শেষে "-Dirty" শব্দটি যুক্ত করবে। মতে git-describe(1):

   --dirty[=<mark>]
       Describe the working tree. It means describe HEAD and appends <mark> (-dirty by default) if
       the working tree is dirty.

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


0

এই থ্রেড নিকট থেকে উত্তর একটি ভাল সমন্বয় হতে পারে .. কিন্তু আমার জন্য এই কাজ ... আপনার জন্য .gitconfigএর [alias]অধ্যায় ...

          # git untracked && echo "There are untracked files!"
untracked = ! git status --porcelain 2>/dev/null | grep -q "^??"
          # git unclean && echo "There are uncommited changes!"
  unclean = ! ! git diff --quiet --ignore-submodules HEAD > /dev/null 2>&1
          # git dirty && echo "There are uncommitted changes OR untracked files!"
    dirty = ! git untracked || git unclean

0

নোংরা অবস্থা সনাক্ত করতে আমি সবচেয়ে সহজ স্বয়ংক্রিয় পরীক্ষা = অবিরত ফাইলগুলি সহ কোনও পরিবর্তন :

git add --all
git diff-index --exit-code HEAD

বিঃদ্রঃ:

  • ছাড়া add --all diff-indexআনট্র্যাকড ফাইলগুলি লক্ষ্য করে না
  • সাধারণত, আমি git resetসমস্ত কিছু ফিরিয়ে আনতে ত্রুটি কোডটি পরীক্ষা করে চালাচ্ছি।

প্রশ্নটি বিশেষত "একটি স্ক্রিপ্ট থেকে" ... কেবলমাত্র নোংরা অবস্থার জন্য পরীক্ষা করার জন্য সূচীটি পরিবর্তন করা ভাল ধারণা নয়।
স্কটজে

@ স্কটজে, সমস্যাটি সমাধান করার সময়, সবাই সূচকে পরিবর্তন করা যায় কিনা তা নিয়ে প্রয়োজনীয়ভাবে কঠোর হয় না। সংস্করণ নম্বর সহ অটো-প্যাচ উত্স সম্পর্কিত স্বয়ংক্রিয় কাজের ক্ষেত্রে বিবেচনা করুন এবং একটি ট্যাগ তৈরি করুন - আপনাকে অবশ্যই নিশ্চিত করতে হবে যে অন্য কোনও স্থানীয় পরিবর্তনগুলি সেই পথেই থাকে না (নির্বিশেষে তারা সূচকে থাকুক বা না থাকুক)। এখনও অবধি, এটি তালাবিহীন ফাইলগুলি সহ যে কোনও পরিবর্তনের জন্য নির্ভরযোগ্য পরীক্ষা ছিল ।
uvsmtid

-3

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

function git_dirty {
    text=$(git status)
    changed_text="Changes to be committed"
    untracked_files="Untracked files"

    dirty=false

    if [[ ${text} = *"$changed_text"* ]];then
        dirty=true
    fi

    if [[ ${text} = *"$untracked_files"* ]];then
        dirty=true
    fi

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