বর্তমান শাখায় প্রতিশ্রুতিবদ্ধ কিছু নেই কিনা তা কীভাবে পরীক্ষা করবেন?


172

লক্ষ্যটি একটি দ্ব্যর্থহীন স্ট্যাটাস পাওয়া যা শেল কমান্ডের মাধ্যমে মূল্যায়ন করা যায়।

আমি চেষ্টা করেছি git statusতবে প্রতিশ্রুতিবদ্ধ আইটেম থাকলেও এটি সর্বদা 0 প্রদান করে।

git status
echo $?  #this is always 0

আমার একটি ধারণা আছে তবে আমি মনে করি এটি বরং একটি খারাপ ধারণা।

if [ git status | grep -i -c "[a-z]"> 2 ];
then
 code for change...
else
  code for nothing change...
fi

অন্য কোন উপায়?


নিম্নলিখিত সমাধান সহ আপডেট করুন, মার্ক লংগায়ারের পোস্ট দেখুন

আমি এটি চেষ্টা করেছিলাম তবে এটি সমস্যার কারণ হয়ে দাঁড়িয়েছে।

if [ -z $(git status --porcelain) ];
then
    echo "IT IS CLEAN"
else
    echo "PLEASE COMMIT YOUR CHANGE FIRST!!!"
    echo git status
fi

আমি নিম্নলিখিত ত্রুটি পেয়েছি [: ??: binary operator expected

এখন, আমি লোকটির দিকে তাকিয়ে আছি এবং গিট ডিফের চেষ্টা করছি

=================== আমার আশার কোড এবং আরও উত্তরের উত্তর আশা করি ======================

#if [ `git status | grep -i -c "$"` -lt 3 ];
# change to below code,although the above code is simple, but I think it is not strict logical
if [ `git diff --cached --exit-code HEAD^ > /dev/null && (git ls-files --other --exclude-standard --directory | grep -c -v '/$')` ];
then
        echo "PLEASE COMMIT YOUR CHANGE FIRST!!!"
    exit 1

else
    exit 0
fi

4
আপডেট বিভাগে, মনে হচ্ছে আপনি তাঁর উত্তরে স্বাক্ষরিত পরামর্শগুলি যা করছেন তা বাস্তবে করছেন না - যেমন তিনি বলেছেন, আপনাকে প্রায় চারপাশে ডাবল-কোট লাগানো দরকার । এছাড়াও, আপনি যদি নিজের বার্তায় বিস্ময়কর চিহ্নগুলি রাখতে চান, আপনাকে ডাবল উদ্ধৃতিগুলির পরিবর্তে একক উদ্ধৃতি ব্যবহার করতে হবে - অর্থাত্ এটি পরিবর্তে হওয়া উচিত$(git status --porcelain)echo 'PLEASE COMMIT YOUR CHANGE FIRST!!!'
মার্ক লংগায়ার

4
যেমনটি মার্ক বলেছেন: আপনার চারদিকে ডাবল কোট লাগানো দরকার$(git status --porcelain) , যেমনটি আমি আপনাকে বলেছিলাম!
eckes

1
যদি উত্তরগুলির অংশগুলি অন্তর্ভুক্ত না করে তবে এই প্রশ্নগুলি অনেক বেশি কার্যকর হবে।
ওবরলিস

@ 9nix00 আপনাকে যা বলা হয়েছে তা করুন এবং উপরে শেল স্ক্রিপ্টে বাগটি সম্পাদনা এবং ঠিক করুন: বিইউজি: যদি [-z $ (কিছু কমান্ড)] ফিক্স: যদি [-z "some (কিছু আদেশ)"]
মার্চএইচ

উত্তর:


232

আউটপুট git status --porcelainখালি কিনা তা পরীক্ষার বিকল্প হ'ল আপনার যত্ন নেওয়া প্রতিটি শর্তটি আলাদাভাবে পরীক্ষা করা। কেউ সর্বদা যত্ন নিতে পারে না, উদাহরণস্বরূপ, যদি আউটপুটে অনতিযুক্ত ফাইল থাকে git status

উদাহরণস্বরূপ, কোনও স্থানীয় অনাস্থাবিহীন পরিবর্তন রয়েছে কিনা তা দেখতে আপনি রিটার্ন কোডটি দেখতে পারেন:

git diff --exit-code

পর্যায়ক্রমে প্রতিশ্রুতিবদ্ধ না হলেও প্রতিশ্রুতিবদ্ধ না এমন কোনও পরিবর্তন আছে কিনা তা পরীক্ষা করতে আপনি এর রিটার্ন কোডটি ব্যবহার করতে পারেন:

git diff --cached --exit-code

অবশেষে, আপনি যদি আপনার কার্যকারী বৃক্ষের তালিকায় থাকা কোনও ফাইল নেই যা উপেক্ষা করা হয় না তা জানতে চান, আপনি নীচের কমান্ডের আউটপুট খালি কিনা তা পরীক্ষা করতে পারেন:

git ls-files --other --exclude-standard --directory

আপডেট: আপনি আউটপুটে ডিরেক্টরিগুলি বাদ দিতে এই আদেশটি পরিবর্তন করতে পারবেন কিনা তা নীচে জিজ্ঞাসা করুন। আপনি খালি ডিরেক্টরিগুলি যুক্ত করে বাদ দিতে পারেন --no-empty-directory, তবে সেই আউটপুটে সমস্ত ডিরেক্টরি বাদ দিতে আমার মনে হয় আপনাকে আউটপুট ফিল্টার করতে হবে, যেমন:

git ls-files --other --exclude-standard --directory | egrep -v '/$'

-vথেকে egrepঅর্থ একমাত্র আউটপুট লাইন যে প্যাটার্ন মিলছে না, এবং প্যাটার্ন কোন লাইন করে একটি সঙ্গে প্রান্ত মিলে যায় /


আমি এই টিপসগুলি ঝুঁকিয়েছি এবং একটি সমস্যা আছে। অর্থাৎ, গিট এলএস-ফাইল ব্যবহার করুন - অন্য - এক্সক্লুড-স্ট্যান্ডার্ড - ডিরেক্টরিতে ডিরেক্টরিটি অন্তর্ভুক্ত করুন। এই ডিরেক্টরিগুলি কি কোনওভাবে বাদ নেই?
9nix00

হ্যাঁ, এটি আমি চাই এবং আমি নতুন স্ক্রিপ্ট-কোডের জন্য আমার পোস্ট আপডেট করি। আমি মনে করি আপনার পরামর্শটি আরও কঠোর যৌক্তিক যদিও আরও কোড লল ... এবং আশা করি এর থেকে আরও ভাল উত্তর আসবে।
9nix00

3
@ অ্যালবফান: এটি গিট- ডিফ ম্যান পৃষ্ঠায় রয়েছে : " ডিফের (1) এর মতো কোডগুলি দিয়ে প্রোগ্রামটি প্রস্থান করুন That অর্থাৎ, পার্থক্য থাকলে 0 এর সাথে প্রস্থান হয় এবং 0 এর অর্থ কোনও পার্থক্য নেই।"
লংগায়ার

কেবল উল্লেখ করার জন্য, এটি 2007 13da0fc0 থেকে কমপক্ষে সেখানে রয়েছে , শেল স্ক্রিপ্টগুলির জন্য সত্যই কার্যকর এবং
গিটের

10
--quiet(যা বোঝায় --exit-code) আউটপুটও স্থির করে দেয়, যারা কেবল প্রস্থান কোড চান।
পিএইচএস

113

git statusকেবলমাত্র ফেরতের মান আপনাকে প্রস্থান করার কোডটি বলে দেয় git status, যদি কোনও সংশোধন করা হয় না।

আপনি যদি git statusআউটপুটটির আরও কম্পিউটার-পঠনযোগ্য সংস্করণ চান তবে চেষ্টা করুন

git status --porcelain

সে git statusসম্পর্কে আরও তথ্যের জন্য বিবরণ দেখুন ।

নমুনা ব্যবহার (স্ক্রিপ্টটি যদি git status --porcelainকোনও আউটপুট দেয় তবে কোনও পার্সিংয়ের প্রয়োজন হয় না কেবল তা পরীক্ষা করে ):

if [ -n "$(git status --porcelain)" ]; then
  echo "there are changes";
else
  echo "no changes";
fi

দয়া করে নোট করুন যে পরীক্ষার জন্য আপনাকে স্ট্রিংটি উদ্ধৃত করতে হবে, অর্থাত্ আউটপুট git status --porcelain। পরীক্ষার নির্মাণ সংক্রান্ত আরও ইঙ্গিতগুলির জন্য, অ্যাডভান্সড ব্যাশ স্ক্রিপ্টিং গাইড (বিভাগের স্ট্রিং তুলনা ) দেখুন।


হাই, আপনি একটি ভাল পরামর্শ দিন, আমি এটি চেষ্টা করেছিলাম, তবে স্ক্রিপ্টে এটি কিছু সমস্যা সৃষ্টি করেছে, আমি এটি উন্নত করেছি, যদি আমরা এটি ব্যবহার করি [-z $ (গিট স্ট্যাটাস - পার্সেলাইন)]; এটি কিছু ত্রুটি পাবে, [: ??: বাইনারি অপারেটর প্রত্যাশিত আমি ম্যানুয়ালটি খুঁজে পেয়েছি এবং [-z $ (গিট স্ট্যাটাস - শর্ট)]] ব্যবহার করলে; এই কাজ করতে পারেন, ধন্যবাদ!
9nix00

দুঃখিত, এখনও সমস্যা আছে। কমিট যখন পরিষ্কার হয়। চীনামাটির বাসন এবং সংক্ষিপ্ত উভয়ই ঠিক আছে। কিন্তু যখন অঙ্গীকার পরিষ্কার হয় না। এটি ত্রুটির কারণ হবে। [: ??: বাইনারি অপারেটর প্রত্যাশিত আমি মনে করি সম্ভবত এটি এনকোড করার জন্য আমাদের বেস 64 ব্যবহার করার চেষ্টা করা উচিত। আমাকে চেষ্টা করতে দাও! বেস64 কমান্ড সরঞ্জামগুলি ডাউনলোড করা .... লোল
9nix00

প্রতিশ্রুতি পরিষ্কার না হলে এটি সমস্যার সৃষ্টি করে।
9nix00

1
দুর্দান্ত সমাধান। অতিরিক্ত দৃust়তার জন্য আপনি || echo noকমান্ড প্রতিস্থাপনের সাথে যুক্ত হতে পারেন যাতে কর্মক্ষেত্রটি ভুলভাবে পরিষ্কারভাবে রিপোর্ট করা না যায় যদি git statusমৌলিকভাবে ব্যর্থ হয়। এছাড়াও, আপনার কোডটি (প্রশংসনীয়ভাবে) পসিক্স-অনুগত, তবে যেহেতু আপনি কোনও বাশ গাইডের সাথে লিঙ্ক করেছেন, আমাকে যুক্ত করতে দিন যে আপনি যদি [[ ... ]]পসিক্স-সামঞ্জস্যের পরিবর্তে ব্যাশ ব্যবহার করেন তবে আপনাকে [ ... ]আদেশের বদলে ডাবল-উদ্ধৃতি দেওয়ার প্রয়োজন হবে না (যদিও এটি কোন ক্ষতি) আছে: [[ -z $(git status --porcelain) ]]
mklement0

@ কয়েক সপ্তাহ আগে আমি একটি নতুন রেপো শুরু করেছি, আমি একটি প্রতিশ্রুতি যুক্ত করেছি, কিছু প্রাক-কমিট-হুক লেখার চেষ্টা করেছি এবং কী প্রতিশ্রুতিবদ্ধ হবে তা যাচাই করার চেষ্টা করেছি এবং আপনি যা বলছেন তা আমার ক্ষেত্রে কার্যকর হয়নি।
alinsoar

33

আপনি যদি আমার মতো হন তবে আপনি তা জানতে চান:

1) বিদ্যমান ফাইলগুলিতে পরিবর্তন 2) নতুন যুক্ত হওয়া ফাইল 3) মুছে ফেলা ফাইল

এবং বিশেষত 4) টি তালাবিহীন ফাইল সম্পর্কে জানতে চান না।

এটি করা উচিত:

git status --untracked-files=no --porcelain

রেপো পরিষ্কার থাকলে স্ক্রিপ্ট থেকে বেরিয়ে আসার জন্য আমার বাশ কোডটি এখানে। এটি অপ্রকাশিত ফাইল বিকল্পের সংক্ষিপ্ত সংস্করণ ব্যবহার করে:

[[ -z $(git status -uno --porcelain) ]] && echo "this branch is clean, no need to push..." && kill -SIGINT $$;

4
+1 এর জন্য —untracked-files=no; আমি মনে করি আপনার পরীক্ষাটি সহজতর করা যেতে পারে [[ -z $(git status --untracked-files=no --porcelain) ]]git statusস্ট্যাডারকে লেখা উচিত নয়, যদি না মৌলিক কিছু ভুল হয়ে যায় - এবং তারপরে আপনি সেই আউটপুটটি দেখতে চান না । (যদি আপনি এই ইভেন্টে আরও দৃ behavior় আচরণ চান, || echo noতবে কমান্ড প্রতিস্থাপনের সাথে যুক্ত করুন যাতে পরিষ্কারতার পরীক্ষা এখনও ব্যর্থ হয়)। স্ট্রিং তুলনা / -zঅপারেটর মাল্টি-লাইন স্ট্রিংগুলির সাথে ডিল করতে পারে - প্রয়োজন নেই tail
mklement0

2
ধন্যবাদ @ এমকেলেটমেন্ট ০, এমনকি খানিকটা খাটো:[[ -z $(git status -u no --porcelain) ]]
মুডবুম

1
সংশোধন: আমার সংক্ষিপ্ত সংস্করণটি আসলে "না" নামের ফাইলটিতে স্থিতি পরীক্ষা করে! Bzzt। হওয়া উচিত: [[ -z $(git status -uno --porcelain) ]]
মুডবুম

2
আমি ফলোআপ প্রশংসা করি; একটি সূক্ষ্ম বাগ নেই - শিক্ষা হল, সংক্ষিপ্ত সঙ্গে অপশন ঐচ্ছিক আর্গুমেন্ট যুক্তি যোগ থাকতে হবে সরাসরি , মাঝে কোন হোয়াইটস্পেস সঙ্গে। সংক্ষিপ্ত সংক্ষিপ্ত সংস্করণটি সরাসরি আপনার উত্তরে অন্তর্ভুক্ত করার বিষয়ে কীভাবে?
mklement0

9

পরীক্ষাটি সম্পাদনের জন্য git status --porcelainএকটি সাধারণের সাথে একত্রিত করা সম্ভব grep

if git status --porcelain | grep .; then
    echo Repo is dirty
else
    echo Repo is clean
fi

আমি কখনও কখনও এটি একটি সাধারণ ওলাইনার হিসাবে ব্যবহার করি:

# pull from origin if our repo is clean
git status --porcelain | grep . || git pull origin master

যোগ -qsআপনার grep কমান্ড প্রয়োগ করার জন্য এটি নীরব করা।


2
কমনীয়তার জন্য +1; সামান্য সতর্কতা: git statusমারাত্মকভাবে ব্যর্থ হওয়া উচিত (যেমন, একটি দূষিত রেপো), আপনার পরীক্ষাটি ভুলভাবে একটি পরিষ্কার কর্মক্ষেত্রের প্রতিবেদন করবে । একটি বিকল্প ব্যবহার করা হয় git status --porcelain 2>&1, তবে তা যদি আপনি গ্রিপ ব্যবহার করেন তবে ত্রুটি বার্তাটি 'খাওয়া' হবে -q। ( (git status --porcelain || echo err) | grep -q .
এটির

বিকল্পভাবে, কেউ লিখতে পারেন:test -z "$(git status --porcelain)" || git pull origin master
ভ্যাসিলিএনভিকভ

5

গিট সোর্স কোড থেকে একটি শ স্ক্রিপ্ট রয়েছে যার মধ্যে নিম্নলিখিতগুলি রয়েছে।

require_clean_work_tree () {
    git rev-parse --verify HEAD >/dev/null || exit 1
    git update-index -q --ignore-submodules --refresh
    err=0

    if ! git diff-files --quiet --ignore-submodules
    then
        echo >&2 "Cannot $1: You have unstaged changes."
        err=1
    fi

    if ! git diff-index --cached --quiet --ignore-submodules HEAD --
    then
        if [ $err = 0 ]
        then
            echo >&2 "Cannot $1: Your index contains uncommitted changes."
        else
            echo >&2 "Additionally, your index contains uncommitted changes."
        fi
        err=1
    fi

    if [ $err = 1 ]
    then
        test -n "$2" && echo >&2 "$2"
        exit 1
    fi
}

এই স্নিপলেটটি দেখায় যে কীভাবে এটি ব্যবহার করা সম্ভব git diff-filesএবং git diff-indexপূর্বে পরিচিত ফাইলগুলিতে কোনও পরিবর্তন আছে কিনা তা খুঁজে বের করা সম্ভব । তবে এটি আপনাকে কার্যকারী ট্রিটিতে কোনও নতুন অজানা ফাইল যুক্ত করা হয়েছে কিনা তা খুঁজে বের করার অনুমতি দেয় না।


নতুন ফাইল ব্যতীত এটি কাজ করে। আমরা এটি যোগ করতে পারেন। যদি! গিট এলএস-ফাইল - অন্য - এক্সক্লুড - স্ট্যান্ডার্ড - ডিরেক্টরি | grep -c -v '/ $' তারপরে 0 টি থেকে প্রস্থান করুন প্রতিধ্বনিত করুন "দয়া করে আপনার নতুন ফাইলটি প্রতিশ্রুতিবদ্ধ করুন, আপনি যদি এটি যুক্ত করতে না চান তবে অনুগ্রহ করে এটি গিট-উপেক্ষা ফাইলটিতে যুক্ত করুন।" প্রস্থান 1 ফাই
9nix00

শুধু if [ -n "$(git ls-files --others --exclude-standard)" ]কোন অতিরিক্ত বংশীধ্বনিতুল্য বা greping ছাড়া untracked ফাইল সনাক্ত করতে যথেষ্ট হওয়া উচিত।
অ্যারোমাস্টার

5

আমি এটিতে একটি পরীক্ষা করব:

git diff --quiet --cached

বা এটি সুস্পষ্ট হতে:

git diff --quiet --exit-code --cached

কোথায়:

--exit-কোড

ডিফের অনুরূপ কোডগুলি সহ প্রোগ্রামটি প্রস্থান করুন (1)। যেটি হ'ল এটি 1 দিয়ে প্রস্থান করে যদি সেখানে পার্থক্য ছিল এবং 0 অর্থ কোনও পার্থক্য নেই।

--quiet

প্রোগ্রামের সমস্ত আউটপুট অক্ষম করুন। সূচিত হয় - এক্সিট-কোড


3

আলোচনায় আমি কিছুটা দেরি করেছি, তবে কেবল যদি আপনার 0 এর এক্সিট কোড থাকা দরকার তবে git status --porcelainকিছু না ফেরায় এবং! = 0, এটি চেষ্টা করুন:

exit $( git status --porcelain | wc -l )

এটি যখন 255 লাইনের বেশি থাকে তখন সমস্যাগুলি হওয়ার ঝুঁকিতে এটি লাইনগুলির সংখ্যাটি প্রস্থান কোড করে দেবে। সুতরাং

exit $( git status --porcelain | head -255 | wc -l )

এর জন্য অ্যাকাউন্ট হবে;)


1
যদি আউটপুট 255 লাইনের বেশি থাকে তবে এটি মূলত সংজ্ঞায়িত হবে।
ট্রিপলি

ভাল দাগ, ধন্যবাদ!
স্কিভ

2

আমি এটি স্ক্রিপ্টে ব্যবহার করছি:

  • 0 যখন সবকিছু পরিষ্কার থাকে
  • 1 যখন কোনও পৃথক বা চিহ্নবিহীন ফাইল থাকে

    [-z "$ (গিট স্ট্যাটাস - পার্সেলাইন)"]


ব্যবহার if ! git diff --quiet; thenকরা ক্লিনার এবং আরও পারফরম্যান্ট (আমার মনে হয়)। অন্য কথায়, প্রস্থান কোডটি ব্যবহার করুন, স্টাডাউট নয়।
আলেকজান্ডার মিলস 21

1
ক্যাশেড পরিবর্তনের জন্য @ আলেকজান্ডারমিলগুলি git diff --quietআলাদা আচরণ করে git status --porcelain
মার্টিন ভন উইট্টিচ

0

সুন্দর নয়, তবে কাজ করে:

git status | grep -qF 'working directory clean' || echo "DIRTY"

বার্তাটি স্থানীয়ভাবে নির্ভরশীল কিনা তা নিশ্চিত নয়, তাই সম্ভবত LANG=Cসামনে একটি রাখুন ।

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