বর্তমান ডিরেক্টরিটি একটি গিট সংগ্রহস্থল কিনা তা পরীক্ষা করুন


197

আমি zsh এ গিট পরিচালনার জন্য একাধিক স্ক্রিপ্ট লিখছি।

বর্তমান ডিরেক্টরিটি গিট সংগ্রহস্থল কিনা তা আমি কীভাবে পরীক্ষা করব? (যখন আমি গিট রেপোতে নেই, আমি একগুচ্ছ কমান্ড কার্যকর করতে এবং একগুচ্ছ fatal: Not a git repositoryপ্রতিক্রিয়া পেতে চাই না )।


অনুপ্রেরণার জন্য আপনি কি ব্যাশ সমাপ্তি ফাইলটি (অবদান / সমাপ্তি / গিট-কমপ্লিউশন.বাশে) দেখেছেন? আমি আমার ব্যাশ প্রম্পটের অংশ হিসাবে __git_ps1 কমান্ডটি ব্যবহার করি। প্রকৃতপক্ষে এটি বেশিরভাগ zsh এর মধ্যে উত্স হবে। __Gitdir ফাংশনটি সম্ভবত আপনি চান।
জ্যাবি

1
@ জবাববি: আপনি কেন এই উত্তরটি দিচ্ছেন না?
amarillion

আপনি ইতিমধ্যে zsh বিতরণ ফাংশন চেক করেছেন?
এমবিও


1
দ্রষ্টব্য: বর্তমানের উত্তরগুলির মধ্যে কেউই পরিবেশ $GIT_DIRবা $GIT_WORK_TREEপরিবর্তনশীলগুলি, বা কীভাবে তারা মিথস্ক্রিয়া করে তা বিবেচনা করে না।
o11c

উত্তর:


154

ব্যাশ সমাপ্তি ফাইল থেকে অনুলিপি করা হয়েছে, নিম্নলিখিতটি করার এটি একটি নিখুঁত উপায়

# Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
# Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
# Distributed under the GNU General Public License, version 2.0.

if [ -d .git ]; then
  echo .git;
else
  git rev-parse --git-dir 2> /dev/null;
fi;

আপনি হয় একটি ফাংশন এ মোড়ানো বা এটি একটি স্ক্রিপ্ট ব্যবহার করতে পারেন।

ব্যাশ এবং zsh এর জন্য উপযুক্ত এক লাইনের শর্তে ঘনীভূত

[ -d .git ] && echo .git || git rev-parse --git-dir > /dev/null 2>&1

3
@ উইলিয়াম পার্সেল যখন আপনার দরকার নেই তখন কেন কাঁটাচামচ? মূলত তুচ্ছ মামলায় গতির জন্য।
জ্যাবি

16
উত্তর ব্যবহার করতে আপডেট করা উচিত git rev-parse --is-inside-git-dirgit rev-parse --is-inside-work-treeআমার PS1 সেট করার আগে আমি ব্যক্তিগতভাবে ব্যবহার করি।
জুলিওহম

11
@ জুলিওহম --is-inside-git-dirকেবলমাত্র সত্যই ফিরে আসবে যদি আপনি প্রকৃতপক্ষে কোনও ভাণ্ডারের .gitডিরেক্টরিতে থাকেন । আমি মনে করি না যে ওপি এটি সন্ধান করছে।
nyuszika7h

7
আমরাও --is-inside-work-treeনা --is-inside-git-dirযখন আপনি একটি Git রেপো বাইরে কাজ করবে। দেখুন: groups.google.com/forum/#!topic/git-users/dWc23LFhWxE
ফিশারদেবদেব

7
গিট ডিরেক্টরি ছাড়া অন্য কিছু হলে এটি ব্যর্থ হবে .git। দৃust়তার জন্য, বাদ দিন [ -d .git ]এবং কেবল ব্যবহার করুন git rev-parse ...
পিটার জন অ্যাকলাম

133

তুমি ব্যবহার করতে পার:

git rev-parse --is-inside-work-tree

আপনি যদি গিট রেপো ওয়ার্কিং ট্রিতে থাকেন তবে 'সত্য' মুদ্রণ করবে।

মনে রাখবেন যে আপনি যদি গিট রেপোর বাইরে থাকেন (এবং 'মিথ্যা' মুদ্রণ না করেন) তবে এটি এখনও STDERR এ আউটপুট দেয়।

এই উত্তর থেকে নেওয়া: https://stackoverflow.com/a/2044714/12983


এটি পরীক্ষা করে দেখার সহজ উপায় simple
ক্যালবার্টস

3
এটি এখনও কোনও খালি সংগ্রহস্থলের জন্য মিথ্যা মুদ্রণ করবে যার কোনও কার্যকারী গাছ নেই
noggin 182

এটি উপ-ডিরেক্টরি বিবেচনা করে না। আমি না যাচাই করতে হবে git rev-parse --show-toplevelsubfolder আমি খুঁজে দেখছি সাথে খেলাগুলি
Alper

নির্বাচিত উত্তর এমনকি কিছু মুদ্রণ না। এই এক কাজ।
স্কটিবিলেডস

47

গিট রেভ-পার্স --git-dir ব্যবহার করুন

যদি গিট রেভ-পার্স করুন --git-dir </ dev / null 2> & 1; তারপর
  : # এটি একটি বৈধ গিট সংগ্রহস্থল (তবে বর্তমানের কাজ করছে)
    # ডিরেক্টরি শীর্ষ স্তরের নাও হতে পারে।
    # আপনি যত্ন পেলে গিট রেভ-পার্স কমান্ডের আউটপুট পরীক্ষা করুন)
আর
  : # এটি গিটের ভাণ্ডার নয়
ফাই

27

অথবা আপনি এটি করতে পারেন:

inside_git_repo="$(git rev-parse --is-inside-work-tree 2>/dev/null)"

if [ "$inside_git_repo" ]; then
  echo "inside git repo"
else
  echo "not in git repo"
fi

2
আমি এটি পছন্দ করি কারণ এটি একটি উপ ডিরেক্টরি থেকেও কাজ করে
joehanna


7

এটি করার কোনও সার্বজনীনভাবে অ্যাক্সেসযোগ্য / নথিভুক্ত উপায় আছে কিনা তা নিশ্চিত নয় (এমন কিছু অভ্যন্তরীণ গিট ফাংশন রয়েছে যা আপনি গিট সোর্সে নিজেই ব্যবহার / অপব্যবহার করতে পারবেন)

আপনি যেমন কিছু করতে পারে;

if ! git ls-files >& /dev/null; then
  echo "not in git"
fi

7

@ অ্যালেক্স কোরির উত্তরের ভিত্তিতে :

[ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" == "true" ]

কোনও অপ্রয়োজনীয় ক্রিয়াকলাপ নেই এবং -eমোডে কাজ করে।

  • @ Go2null যেমন উল্লেখ করেছে , এটি একটি খালি রেপোতে কাজ করবে না। যদি আপনি যে কোনও কারণের জন্য খালি রেপো নিয়ে কাজ করতে চান তবে আপনি কেবলমাত্র git rev-parseতার ফলাফলকে অগ্রাহ্য করে সফল হওয়ার জন্য পরীক্ষা করতে পারেন ।
    • আমি এটিকে একটি অপূর্ণতা বিবেচনা করি না কারণ উপরের লাইনটি স্ক্রিপ্টিংয়ের জন্য অন্তর্ভুক্ত রয়েছে এবং কার্যত সমস্ত gitকমান্ডগুলি কেবল একটি ওয়ার্কট্রির অভ্যন্তরে বৈধ। সুতরাং স্ক্রিপ্টিংয়ের উদ্দেশ্যে, আপনি সম্ভবত "গিট রেপো" এর ভিতরে নয় বরং একটি ওয়ার্কট্রির ভিতরে থাকতে আগ্রহী।

এটি একটি খালি গিট রেপোর ভিতরে ব্যর্থ হয়
go2null

আউটপুট পরীক্ষা করার পরিবর্তে, রিটার্নের মানটি পরীক্ষা করা ভাল practice মোটেও অনুরোধ করবেন না [। কেবলমাত্র if git rev-parse --is-inside-work-tree; then ...(পছন্দসই পুনঃনির্দেশগুলি সহ) করুন
উইলিয়াম পার্সেল

1
: @WilliamPursell প্রস্থান মান পরীক্ষণ এখানে কাজ করে না stackoverflow.com/questions/2180270/...
ivan_pozdeev

@ ইভান_পোজদেদেভ আপনার "কাজ" এর সংজ্ঞা উপর নির্ভর করে। এই ক্ষেত্রে, আমি বলব যে রিটার্ন মানটি পরীক্ষা করা কার্যকর হয়, যখন আউটপুট চেক করে না। উভয় ক্ষেত্রেই, শেলটিতে কোড লেখার জন্য সর্বোত্তম অনুশীলনের দৃষ্টিকোণ থেকে, ফেরতের মানটি পরীক্ষা করা আরও উপযুক্ত appropriate
উইলিয়াম পার্সেল

@ উইলিয়ামাম পার্সেল যদি আপনি লিঙ্কযুক্ত মন্তব্যটি পড়ে থাকেন তবে আপনি জানতেন যে এখানে আমি "কাজ করে না" বলতে কী বোঝাতে চাইছি।
ivan_pozdeev

6

আর একটি সমাধান হ'ল কমান্ডের প্রস্থান কোড পরীক্ষা করা।

git rev-parse 2> /dev/null; [ $? == 0 ] && echo 1

আপনি যদি গিট সংগ্রহস্থল ফোল্ডারে থাকেন তবে এটি 1 মুদ্রণ করবে।


নোট করুন যে আপনি .gitডিরেক্টরিতে থাকা সত্ত্বেও এটির আরসি 0 থাকবে - যা আপনি চাইবেন বা নাও চান।
ivan_pozdeev

গিটের বুদ্ধিমানভাবে লেখা হয়েছে যাতে আপনি চান না এমন ফাইলগুলি বন্ধ করতে পারেন git rev-parse 2>&-,।
জেথিল

3

এই উত্তরটি একটি নমুনা পসিক্স শেল ফাংশন এবং @ জাবির উত্তরের পরিপূরক হিসাবে ব্যবহারের উদাহরণ সরবরাহ করে ।

is_inside_git_repo() {
    git rev-parse --is-inside-work-tree >/dev/null 2>&1
}

git0যদি এটি গিট সংগ্রহস্থলের অভ্যন্তরে থাকে তবে ত্রুটিযুক্ত স্তরটি ফেরত দেয় , অন্যথায় এটি ত্রুটিযুক্তকে ফেরত দেয় 128। (এটি ফিরে আসে trueবা falseযদি এটি গিট ভাণ্ডারের অভ্যন্তরে থাকে))

ব্যবহারের উদাহরণ

for repo in *; do
    # skip files
    [ -d "$repo" ] || continue
    # run commands in subshell so each loop starts in the current dir
    (
        cd "$repo"
        # skip plain directories
        is_inside_git_repo || continue
        printf '== %s ==\n' "$repo"
        git remote update --prune 'origin' # example command
        # other commands here
    )
done

যথেষ্ট না. ভিতরে .git, এটি সফল হবে তবে মুদ্রণ করবে false
ivan_pozdeev

@ivan_pozdeev: যদি git rev-parse --is-inside-work-treeআয় trueবা falseতারপর, এটা হল একটি Git রেপো ভিতরে, এবং যে কি ফাংশন আয় হয়। এটি হ'ল, ফাংশনটি সঠিক
go2null

প্রসারিত করতে, উত্তরে বর্ণনামূলক বিবরণটি দেখুন, গিট থেকে প্রত্যাবর্তিত মানটি অগ্রাহ্য করা হবে, ত্রুটি-বিস্মরণ যা ব্যবহার করা হয়।
go2null

2

এটা আমার জন্য কাজ করে। আপনি ত্রুটিগুলি এখনও পান তবে সেগুলি দমন করা সহজ। এটি সাবফোল্ডারগুলির মধ্যে থেকেও কাজ করে!

গিট স্ট্যাটাস> / দেব / নাল 2> & 1 && এর প্রতিধ্বনি হ্যালো ওয়ার্ল্ড!

আপনি যদি শর্তাধীন আরও কিছু করার দরকার হয় তবে আপনি এটি বিবৃতিতে রেখে দিতে পারেন।


2
অনেক ক্ষেত্রে সম্ভবত যথেষ্ট ভাল, তবে এটি একটি খালি গিট রেপোতে ব্যর্থ।
ওয়াইল্ডকার্ড

3
git statusবড় / পুরানো রেপোতে খুব ধীর হতে পারে। আমি এই উদ্দেশ্যে এটি ব্যবহার করব না।
হেনরেবোথা

1

প্রস্থান কোড ব্যবহার করছেন না কেন? যদি বর্তমান ডিরেক্টরিটিতে একটি গিট সংগ্রহস্থল উপস্থিত থাকে তবে তারপরে git branchএবং git tag0 টির প্রস্থান প্রস্থান কোডের আদেশ দেয়; অন্যথায়, একটি শূন্য-বহির্গমন প্রস্থান কোড ফিরে আসবে। এই পদ্ধতিতে, আপনি নির্ধারণ করতে পারবেন কোনও গিট সংগ্রহস্থল উপস্থিত আছে কি না। সহজভাবে, আপনি চালাতে পারেন:

git tag > /dev/null 2>&1 && [ $? -eq 0 ]

সুবিধা : ফ্লেক্সিবি। এটি উভয় খালি এবং নন-বেয়ার স্টোরের জন্য এবং sh, zsh এবং bash এ কাজ করে।

ব্যাখ্যা

  1. git tag: বিদ্যমান আছে কি নেই তা নির্ধারণের জন্য সংগ্রহস্থলের ট্যাগগুলি পাওয়া।
  2. > /dev/null 2>&1: সাধারণ এবং ত্রুটি আউটপুট সহ যেকোনো কিছু মুদ্রণ করা থেকে বিরত রাখা।
  3. [ $? -eq 0 ]: পূর্ববর্তী কমান্ডটি প্রস্থান কোড 0 দিয়ে ফিরে এসেছে কিনা তা পরীক্ষা করে দেখুন। আপনি যেমন জানেন যে, প্রতিটি শূন্য-বহির্গমনটির অর্থ খারাপ কিছু ঘটেছিল। $?পূর্ববর্তী কমান্ডের প্রস্থান কোড পায়, এবং [, -eqএবং ]তুলনা সঞ্চালন।

উদাহরণস্বরূপ, আপনি check-git-repoনিম্নলিখিত বিষয়বস্তু সহ একটি ফাইল তৈরি করতে পারেন , এটি সম্পাদনযোগ্য করে তোলা এবং চালনা করতে পারেন:

#!/bin/sh

if git tag > /dev/null 2>&1 && [ $? -eq 0 ]; then
    echo "Repository exists!";
else
    echo "No repository here.";
fi

0

# গিট রেপো পরীক্ষা করে দেখুন

if [ $(git rev-parse --is-inside-work-tree) = true ]; then
    echo "yes, is a git repo"
    git pull
else
    echo "no, is not a git repo"
    git clone url --depth 1
fi

এটি সেরা অনুশীলন নয়। যদি কোনও ওয়ার্কিং ডিরেক্টরিের বাইরে চালানো হয় তবে আপনি "মারাত্মক: একটি গিট সংগ্রহস্থল নয় (বা কোনও মাতৃ ডিরেক্টরি নেই) পাবেন: stdr এ লিখিত, এবং" না, স্টিডআউটে গিট রেপো নয় ")। এখানে মোটেও প্রার্থনা করার দরকার নেই [। কেবল করুন:if git rev-parse --is-inside-work-tree > /dev/null 2>&1; then ....
উইলিয়াম পার্সেল

আমার ক্ষেত্রে, আমি এটিতে আরামদায়ক এবং আমি আমার লগগুলিতে এই ত্রুটিটি ট্র্যাক করতে চাই। চিয়ার্স!
পাস্কেল অ্যান্ডি

0
if ! [[ $(pwd) = *.git/* || $(pwd) = *.git ]]; then 
  if type -P git >/dev/null; then
    ! git rev-parse --is-inside-work-tree >/dev/null 2>&1 || {
     printf '\n%s\n\n' "GIT repository detected." && git status
    }
  fi
fi

আপনাকে ivan_pozdeev ধন্যবাদ , এখন আমার একটি পরীক্ষা আছে .git ডিরেক্টরিতে কোডটি চলবে না যাতে কোনও ত্রুটি মুদ্রিত হয় না বা মিথ্যা প্রস্থান স্থিতি হয়।

" ! [[$ ( Pwd ) = .git / || $ (pwd) = * .git]]] " "পরীক্ষা করে যদি আপনি একটি .git রেপোর ভিতরে না থাকেন তবে এটি গিট কমান্ডটি চালাবে। বিল্টিন টাইপ কমান্ডটি আপনি গিট ইনস্টল করেছেন কিনা তা আপনার প্যাথের মধ্যে রয়েছে কিনা তা পরীক্ষা করতে ব্যবহার করা হয়। দেখতে সাহায্যের টাইপ


0

এটি কীভাবে:

if git status -s 2>/dev/null;then
    echo "this is a git repo"
else
    echo "this is NOT a git repo"
fi

-1

আপনি এক বা অন্য গিট-প্রম্পট সরঞ্জামগুলির সাথে আপনার zshrc এ আপনার $ PS1 যুক্ত বা প্রতিস্থাপন করতে পারেন । আপনি গিট রেপোতে রয়েছেন এবং রেপোর অবস্থা রয়েছে কিনা তা আপনাকে সহজেই অবহিত করা যায়।


3
ওপি-র সম্পূর্ণ প্রশ্ন ছিল কীভাবে এটি কোনও স্ক্রিপ্টের মধ্যে থেকে করা যায়
অ্যান্ড্রু সি

এবং স্ক্রিপ্টের মধ্যে থেকে কীভাবে __git_ps1 ব্যবহার করা যাবে না? গিট-প্রম্পটের পুরো পয়েন্টটি হ'ল বর্তমান ডিরেক্টরিটির গিট স্ট্যাটাস যাচাই করা হয়েছিল check
jxqz

-1
! git rev-parse --is-inside-work-tree >/dev/null 2>&1 || { 
  printf '%s\n\n' "GIT repository detected." && git status
}

দ্য ! এমনকি যদি আপনি এটি কোনও ডিরেক্টরিতে চালনা করেন যা গিট রেপো নয় তবে এটি আপনাকে কিছু মারাত্মক ত্রুটি দেয় না neg

আপনি যখন প্রস্থান স্থিতির ঠিক পরে রয়েছেন তাই </ dev / null 2> & 1 টি বার্তা প্রেরণ করে / dev / নালকে{} পরে কমান্ড তাই কমান্ড সম্পর্কিত হয় || গিট রেভ-পার্স সাফল্য পেলে চলবে যেহেতু আমরা একটি ব্যবহার করি! যা গিট রেভ-পার্সের প্রস্থান স্থিতিকে অস্বীকার করেছে। Printf, শুধু রেপো অবস্থা প্রিন্ট করতে কিছু বার্তা ও Git অবস্থা প্রিন্ট হয়।

এটিকে কোনও ফাংশনে মোড়ানো বা কোনও স্ক্রিপ্টে রেখে দিন। আশাকরি এটা সাহায্য করবে


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