আমার স্থানীয় গিট সংগ্রহস্থলের পরিবর্তন হলে আমি কীভাবে বাশ স্ক্রিপ্টে চেক করতে পারি?


176

কিছু স্ক্রিপ্ট রয়েছে যেগুলি পরিবর্তনগুলি পরীক্ষা করে যদি সঠিকভাবে কাজ করে না।

আমি এটির মতো চেষ্টা করেছি:

VN=$(git describe --abbrev=7 HEAD 2>/dev/null)

git update-index -q --refresh
CHANGED=$(git diff-index --name-only HEAD --)
if [ ! -z $CHANGED ];
    then VN="$VN-mod"
fi

গত প্রতিশ্রুতি থেকে কোনও পরিবর্তন হয়েছে কিনা এমন কোনও ধরণের বুলিয়ান চেক রয়েছে, বা আমার স্থানীয় সংগ্রহস্থলে নতুন পরিবর্তন এসেছে কিনা আমি কীভাবে সত্যিই পরীক্ষা করতে পারি?

আমি একটি সংস্করণ তৈরির স্ক্রিপ্টের জন্য এগুলি করছি (যা আমি এখানে কোথাও খুঁজে পেয়েছি)।


3
এর সাথে কী হয়েছে git status?
করলফিলিপ

4
@ কার্লফিলিপ: এটি অনেকগুলি প্রসেসিং করে যা আপনার সত্যই প্রয়োজন হয় না।
ক্যাসাবেল

1
@ কার্ফিলিপ এটি একটি "চীনামাটির বাসিন্দা" কমান্ড, এর অর্থ: স্ক্রিপ্টে ব্যবহারের জন্য উপযুক্ত নয় কারণ আউটপুটটি মানুষের দ্বারা পড়ার জন্য ডিজাইন করা হয়েছে এবং পরিবর্তিত হতে পারে (সংস্করণগুলির মধ্যে বা স্থানীয়করণের কারণে)
অ্যান্ড্রু স্পেন্সার

উত্তর:


201

আপনি যা করছেন প্রায় কাজ করবে: $CHANGEDখালি হওয়ার ক্ষেত্রে আপনার উদ্ধৃতি দেওয়া উচিত এবং -zখালি পরীক্ষা করা হবে যার অর্থ কোনও পরিবর্তন নেই। আপনি যা বোঝাতে চেয়েছিলেন তা হ'ল:

if [ -n "$CHANGED" ]; then
    VN="$VN-mod"
fi

গিতের একটি উদ্ধৃতি GIT-VERSION-GEN:

git update-index -q --refresh
test -z "$(git diff-index --name-only HEAD --)" ||
VN="$VN-dirty"

দেখে মনে হচ্ছে আপনি এটি অনুলিপি করছেন, তবে আপনি উদ্ধৃত করার বিশদটি ভুলে গেছেন।

অবশ্যই, আপনি কেবল এটি করতে পারেন:

if git diff-index --quiet HEAD --; then
    # No changes
else
    # Changes
fi

বা যদি আপনি কেবল "কিছু পরিবর্তিত হয়েছে" কেস সম্পর্কে যত্নশীল হন:

if ! git diff-index --quiet HEAD --; then
    VN="$VN-mod"
fi

ব্যবহারের --quietফলে এই সুবিধাটি পাওয়া যায় যে কোনও একক ভিন্নতার মুখোমুখি হওয়ার সাথে সাথে গিট প্রক্রিয়াজাতকরণ বন্ধ করতে পারে, সুতরাং এটি আপনার পুরো কাজের গাছটি পরীক্ষা করতে হবে না।


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

9
বিস্ময়কর বাশ সম্পূর্ণ করার স্ক্রিপ্টটিgit diff --no-ext-diff --quiet --exit-code নোংরা অবস্থা নির্ধারণ করতে ব্যবহার করছে বলে মনে হচ্ছে ।
mjs

3
@ এমজেএস: এ জাতীয় জিনিসের সন্ধানের জন্য এটি সত্যিই দুর্দান্ত জায়গা! --no-ext-diffবিকল্প যদিও, (কেস কেউ একটি বহিস্থিত পরিবর্তন চালক কনফিগার করেছে) নিরাপত্তার জন্য ভালো --exit-codeপ্রয়োজনীয় করা উচিত হবে না যেহেতু এটি প্রযোজ্য হচ্ছে --quiet
ক্যাসাবেল

4
এটি আমার জন্য কাজ করে না কারণ এটি অনতিযুক্ত ফাইলগুলির প্রতিবেদন করে না
কুকি

1
git diff-indexকেবলমাত্র ফাইল পরিবর্তনের সময়গুলি পরিবর্তন হয়েছে (এবং তাদের বিষয়বস্তু নয়) এমনকি প্রতিবেদনগুলি পরিবর্তন করে। আপনি যদি touchকোনও ফাইল হন তবে এটি এমন পরিবর্তনটির প্রতিবেদন করবে যা চলমান git statusপুনরায় সেট হবে। git statusনীচের হিসাবে ব্যবহার করা ভাল।
সাম্পো

303

ব্যবহার git status:

cd /git/directory
if [[ `git status --porcelain` ]]; then
  # Changes
else
  # No changes
fi

15
'শেল অ্যান্ড গিট আর্কিটেক্টস'-এর সেরা উত্তর, লজ্জার উত্তরগুলি আরও বেশি ভোট দেওয়া হয়েছে।
jwg

4
এটি দুর্দান্ত যেহেতু এটি রূপান্তরিত ফাইলগুলি বিবেচনা করে এবং চীনামাটির বাসন ব্যবহার করে, এটি বিভিন্ন গিট সংস্করণের সাথে আরও সুসংগত হওয়া উচিত।
জয়দ

25
অবিরত ফাইলগুলি উপেক্ষা করার জন্য: যদি [[ git status --porcelain --untracked-files=no]]; তারপরে
ঝড়_ম 2138

4
স্থানীয় পরিবর্তনগুলি পরীক্ষা করার জন্য -> if [[ $(git status --porcelain | wc -l) -gt 0 ]]; then echo CHANGED else echo NOT CHANGED locally fi
কার্লোস সালটোস

3
কি এই কোড আছে: সম্পাদন git status --porcelainযদি আউটপুট খালি না থাকে দেখুন। যদি তাই হয় তার মানে উপস্থিত রয়েছে পরিবর্তনগুলি।
ভাটিয়া-পেরের

18

যদিও জেফ্রুমির উত্তরটি ভাল, আমি কেবল রেফারেন্সের জন্য এটি পোস্ট করছি।

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

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
}

রেফারেন্সের জন্য, এবং যদি আমি এই অধিকারটি পড়ি তবে $1এটি একটি স্ট্রিং যা আপনি চালাতে চান এমন কোনও কাজের নামকরণ এবং $2এটি একটি স্ট্রিং যা ব্যর্থতায় কাস্টম ত্রুটি বার্তা ধারণ করে containing উদাহরণস্বরূপ, এটিকে কল করুনrequire_clean_work_tree deploy "Skipping deploy, clean up your work tree or run dev-push"
ছাতা

6

আমারও একই সমস্যা ছিল, তবে যুক্ত হওয়া ফাইলগুলিও আমাকে পরীক্ষা করতে হয়েছিল। সুতরাং আমি নিম্নলিখিতটি করেছেন:

cd /local/repo
RUN=0
git diff --no-ext-diff --quiet --exit-code || RUN=1
if [ $RUN = 0 ]; then
    RUN=`git ls-files --exclude-standard --others| wc -l`
fi

if [ $RUN = 0 ]; then
    exit 0
fi

5

git status তোমার বন্ধু

git statusকাজ করার জন্য গিট ডিরেক্টরিতে পরিবর্তন করুন :

cd c:/path/to/.git

কাজের গাছ সেট করতে একটি ভেরিয়েবল সেট করুন যাতে না পেয়ে 'ত্রুটিটি এই ওয়ার্ক ট্রিে চালানো উচিত' ত্রুটি:

WORKTREE=c:/path/to/worktree

git statusএকটি বস ভেরিয়েবলের আউটপুট ক্যাপচার করুন

--porcelainকোনও মানক বিন্যাসে এবং পার্সেবলের গ্যারান্টিযুক্ত ব্যবহার করুন :

CHANGED=$(git --work-tree=${WORKTREE} status --porcelain)

যদি -n (নাল নয়), আমাদের পরিবর্তন আছে।

if [ -n "${CHANGED}" ]; then
  echo 'changed';

else
  echo 'not changed';
fi

1
এটির সাথে তালিকৃত ফাইলগুলি সনাক্ত করার সুবিধাও রয়েছে।
লুইজ সি

2

এটিও কাজ করে:

if [ $(git status --porcelain | wc -l) -eq "0" ]; then
  echo "  🟢 Git repo is clean."
else
  echo "  🔴 Git repo dirty. Quit."
  exit 1
fi

1

এটি দুর্দান্তভাবে কাজ করে। এটি প্রভাবিত ফাইলগুলির তালিকাও দেবে:

if git diff-index --name-status --exit-code HEAD;
then
    echo Git working copy is clean...;
else
    echo ;
    echo ERROR: Git working copy is dirty!;
    echo Commit your changes and try again.;
fi;

1
আপনি যদি ভিন্নতা দেখতে না চান তবে কাজটিও git diff --no-ext-diff --quiet --exit-codeকরে।
অ্যালেক্স

1

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

commit(){
    echo "Please enter a commit message..."
    read msg
    git add . --all
    git commit -am $msg
}

check_commit(){
    echo ========== CHECKING FOR CHANGES ========
    changes=$(git diff)
    if [ -n "$changes" ]; then
        echo ""
        echo "*** CHANGES FOUND ***"
        echo "$changes"
        echo ""
        echo "You have uncomitted changes."
        echo "Would you like to commit them (y/n)?"
        read n
        case $n in
            "y") commit;;
            "n") echo "Changes will not be included...";;
            *) echo "invalid option";;
        esac
    else
        echo "... No changes found"
    fi
}

deploy(){
    check_commit
    echo ========== DEPLOYING TO HEROKU ========
    git push heroku master
    heroku run python manage.py syncdb
}

আপনি গিস্টগুলি থেকে এখানে অনুলিপি করতে পারেন: https://gist.github.com/sshadmand/f33afe7c9071bb725105


1

ওপির প্রশ্নটি এখন 9 বছরেরও বেশি পুরনো। আমি man git-statusতখন কী বলেছি তা জানি না , তবে এটি এখন যা বলে তা এখানে:

--porcelain[=<version>]  
Give the output in an easy-to-parse format for scripts. This is similar to the 
short output, but will remain stable across Git versions and regardless of user 
configuration. See below for details.  

The version parameter is used to specify the format version. This is optional and 
defaults to the original version v1 format.  

এটি প্রস্তাব দেয় যে --porcelainআর্গুমেন্ট পরিবর্তনের জন্য কোনও রেপোর স্থিতি পরীক্ষার জন্য উপযুক্ত।

ওপির প্রশ্নটি লিখেছিলেন, "গত প্রতিশ্রুতি থেকে কোনও পরিবর্তন হয়েছে কিনা এমন কোনও ধরণের বুলিয়ান চেক রয়েছে, বা আমার স্থানীয় ভাণ্ডারে নতুন পরিবর্তন হলে আমি কীভাবে সত্যিই পরীক্ষা করতে পারি?"

আমি মনে করি না যে bashএতে প্রতি বুলিয়ান ডেটা ধরণের রয়েছে , তবে এটি পর্যাপ্ত হতে পারে:

[ -z "`git status --porcelain`" ] && echo "NULL-NO DIFFS" || echo "DIFFS EXIST"

এটি if-then-elseকোনও স্ক্রিপ্টের জন্য ফর্ম হিসাবে পুনরায় কাস্ট করা যেতে পারে , বা গিট রেপো ফোল্ডারে থাকাকালীন সিএমএল হিসাবে কার্যকর করা যেতে পারে । অন্যথায়, -Cআগ্রহের রেপোতে একটি নির্দিষ্ট পথ দিয়ে বিকল্পটি ব্যবহার করুন :

git -C ~/path/to/MyGitRepo status --porcelain 

সংযোজন:

  1. কেউ কেউ -u, --untracked-fileএড়াতে চান এমন ফাইলগুলিতে স্ট্যাটাসের প্রতিবেদন এড়ানোর জন্য বিকল্পটি ব্যবহার করার পরামর্শ দেয় । নোট করুন এটি একটি দুর্ভাগ্যজনক পার্শ্ব-প্রতিক্রিয়া সহ আসে : সদ্য যুক্ত হওয়া ফাইলগুলিও স্ট্যাচ করা হয় না। বিকল্পটি কিছু পরিস্থিতিতে কার্যকর , তবে ব্যবহারের আগে এটি সাবধানে বিবেচনা করুন।

0

আমি এটি কীভাবে করব ...

CHANGES=`git status | grep "working directory clean"`
if [ ! CHANGES -eq "" ] then
    # do stuff here
else
    echo "You have uncommitted changes..."
fi

3
আমি গিট স্ট্যাটাসটি ব্যবহার করতে পছন্দ করি তবে স্ক্রিপ্টগুলিতে - পোরস্লেইন ব্যবহার করা এবং ফলাফলকে কোনও পরিবর্তনের জন্য খালি স্ট্রিংয়ের সাথে তুলনা করা ভাল, যেহেতু সংস্করণগুলিতে অসামঞ্জস্যভাবে পরিবর্তন না করার গ্যারান্টিযুক্ত।
পল চেরনোচ

0
nano checker_git.sh

এটি আটকান

#!/bin/bash

echo "First arg: $1"

cd $1

bob="Already up-to-date."
echo $bob

echo $(git pull) > s.txt
cat s.txt
if [ "$(cat s.txt)" == "$bob" ]
then
echo "up"
else
echo "not up"

fi
rm -rf st.txt

চালান sh checker_git.sh gitpath


0

@ রায়ানমুনের উত্তর ( লিঙ্ক ) -এ @ ঝড়_এম 2138 মন্তব্যের ভিত্তিতে আমি নিম্নলিখিতটি ব্যবহার করছি Powershell

function hasChanges($dir="."){ $null -ne (iex "git -C $dir status --porcelain --untracked-files=no") }

gci -Directory | ?{ hasChanges $_ } | %{ Write-Host "$_ has changes" }
gci -Directory | ?{ hasChanges $_ } | %{ iex "git -C $_ add -u"; iex "git -C $_ commit -m"Somemthing" }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.