মার্চুরিয়ালের মাধ্যমে মূল ডিরেক্টরিটি মুদ্রণের একটি উপায় রয়েছে (এতে .hg রয়েছে)
hg root
.Git ডিরেক্টরি রয়েছে এমন ডিরেক্টরি পাওয়ার জন্য কি গিটের সমতুল্য কিছু রয়েছে?
bzr root
বাজারে প্রচুর ব্যবহৃত হয়েছিল
মার্চুরিয়ালের মাধ্যমে মূল ডিরেক্টরিটি মুদ্রণের একটি উপায় রয়েছে (এতে .hg রয়েছে)
hg root
.Git ডিরেক্টরি রয়েছে এমন ডিরেক্টরি পাওয়ার জন্য কি গিটের সমতুল্য কিছু রয়েছে?
bzr root
বাজারে প্রচুর ব্যবহৃত হয়েছিল
উত্তর:
হ্যাঁ:
git rev-parse --show-toplevel
আপনি যদি আরও সরাসরি গিট কমান্ডটির অনুলিপি করতে চান তবে আপনি একটি নাম রাখতে পারেন :
git config --global alias.root 'rev-parse --show-toplevel'
এবং এখন git root
ঠিক যেমন কাজ করবে hg root
।
নোট : একটি submodule এই রুট ডিরেক্টরিটি প্রদর্শন করা হবে submodule এবং না পিতা বা মাতা সংগ্রহস্থল। আপনি যদি গিট> = 2.13 বা ততোধিক ব্যবহার করে থাকেন তবে এমন একটি উপায় রয়েছে যা সাবমডিউলগুলি সুপারপোজেক্টের মূল ডিরেক্টরিটি দেখায়। যদি আপনার গিটটি তার চেয়ে বেশি পুরানো হয় তবে এই অন্য উত্তরটি দেখুন।
git config --global alias.exec '!exec '
যাতে আমি পছন্দ মতো জিনিসগুলি করতে পারি git exec make
। এটি কাজ করে কারণ শেল এলিয়াসগুলি সর্বদা শীর্ষ-স্তরের ডিরেক্টরিতে কার্যকর করা হয়।
hg root
করে। এটি আপনার পরীক্ষিত আউটপুটগুলির শীর্ষ-স্তরের ডিরেক্টরি ছাপিয়ে দেয়। এটি আপনাকে এতে স্যুইচ করে না (এবং বর্তমান ডিরেক্টরি এবং আপনার শেলটির পুরো ধারণাটি কীভাবে ইন্টারঅ্যাক্ট করে তার কারণ এটি এটি করতে পারে নি)।
~/my.proj/foo/bar
এবং এতে ~/my.proj
সিমিলিং করা থাকে ~/src/my.proj
তবে উপরের কমান্ডটি আপনাকে সরিয়ে দেবে ~/src/my.proj
। সমস্যা হতে পারে, এরপরে আপনি যা কিছু করতে চান তা গাছ অজিনস্টিক নয়।
.git
ডিরেক্টরিতে থাকা অবস্থায় এটি কাজ করে না ।
man
জন্য পৃষ্ঠা git-config
(অধীনে ওরফে ) বলেছেন:
যদি উলামের সম্প্রসারণটি বিস্মৃতকরনের সাথে উপসর্গ করা হয় তবে এটি শেল কমান্ড হিসাবে বিবেচিত হবে। [...] নোট করুন যে শেল কমান্ডগুলি কোনও সংগ্রহস্থলের শীর্ষ স্তরের ডিরেক্টরি থেকে কার্যকর করা হবে যা সম্ভবত বর্তমান ডিরেক্টরি হতে পারে না।
সুতরাং, ইউনিক্সে আপনি এটি করতে পারেন:
git config --global --add alias.root '!pwd'
.zshrc
এবং আমি `ওরফে সিজি =" সিডি $ (গিট রুট) "সংজ্ঞায়িত করেছি, তবে $ () অংশটি উত্স-সময়ে মূল্যায়ন হয় এবং সর্বদা ~ / ডটফাইলে নির্দেশ করে, যেখানে আমার zshrc ।
হয়েছে --show-toplevel
শুধুমাত্র সম্প্রতি যোগ করাgit rev-parse
বা কেন কেউ এটা উল্লেখ করা হয়?
থেকে git rev-parse
মানুষ পৃষ্ঠা:
--show-toplevel
Show the absolute path of the top-level directory.
git-rev-parse
- কারণ এটির নামটি এটি পুনর্বিবেচনার স্পেসিফিকেশনগুলি প্রক্রিয়াকরণের বিষয়ে প্রস্তাবিত করে। বিটিডাব্লু, আমি এর git --work-tree
মতো কাজ দেখে খুশি হব git --exec-path[=<path>]
: "যদি কোনও পথ না দেওয়া হয়, তবে গিটটি বর্তমান সেটিংস মুদ্রণ করবে"; কমপক্ষে, আইএমও, এই জাতীয় বৈশিষ্ট্যটি অনুসন্ধান করার জন্য এটি কোনও যৌক্তিক জায়গা হবে।
root = rev-parse --show-toplevel
আপনার গিটকনফিগে উপনাম করতে পারেন ।
git config --global alias.root "rev-parse --show-toplevel"
এবং তারপরে git root
কাজটি করতে সক্ষম হবেন
git rev-parse --show-toplevel
আমি যখন সাব-মডিউলটিতে চেষ্টা করেছিলাম তখন @ রায়ান দ্য ল্যাচ কাজ করে। এটি গিট সাবমডিউলের মূল ডির ছাপায়। এটি আপনার জন্য কী মুদ্রণ করে?
--show-cdup
থেকে --show-top-level
ফেব্রুয়ারী 2011 সালে (পরে এই উত্তরটি জমা ছিল)।
কেমন "git rev-parse --git-dir
"?
F:\prog\git\test\copyMerge\dirWithConflicts>git rev-parse --git-dir
F:/prog/git/test/copyMerge/.git
--git-dir
বিকল্প কাজ মনে হয়।
থেকে Git Rev-পার্স ম্যানুয়েল পৃষ্ঠা :
--git-dir
Show $GIT_DIR if defined else show the path to the .git directory.
আপনি এই git setup-sh
স্ক্রিপ্ট এ এটি কর্ম হিসাবে দেখতে পারেন ।
আপনি যদি গিট> = 2.13 সহ একটি সাবমডিউল ফোল্ডারে থাকেন তবে ব্যবহার করুন :
git rev-parse --show-superproject-working-tree
আপনি ব্যবহার করে থাকেন git rev-parse --show-toplevel
, নিশ্চিত করুন যে এতে গীত 2.25+ (চতুর্থাংশ 1 2020) সাথে আছেন ।
.git
আপনি যদি ইতিমধ্যে মূল ডিরেক্টরিতে থাকেন তবে এই কমান্ডটি একটি আপেক্ষিক পথ দেয় gives (কমপক্ষে, এটি এমএসজিগিতে করে))
এখানে একটি সহজ উত্তর লিখতে, যাতে আমরা ব্যবহার করতে পারি
git root
কাজটি করার জন্য, কেবল নিজের গিটটি ব্যবহার করে কনফিগার করুন
git config --global alias.root "rev-parse --show-toplevel"
এবং তারপরে আপনি নিম্নলিখিতগুলিতে আপনার যুক্ত করতে পারেন ~/.bashrc
:
alias cdroot='cd $(git root)'
যাতে আপনি কেবল cdroot
আপনার রেপুর শীর্ষে যেতে ব্যবহার করতে পারেন।
আপনি যদি ইতিমধ্যে শীর্ষ স্তরে থাকেন বা গিট সংগ্রহস্থলে না থাকেন তবে cd $(git rev-parse --show-cdup)
আপনাকে ঘরে নিয়ে যাবে (কেবল সিডি)। cd ./$(git rev-parse --show-cdup)
এটি ঠিক করার এক উপায়।
cd "$(git rev-parse --show-cdup)"
। এটি কাজ করে কারণ cd ""
আপনাকে পিছনের চেয়ে কোথাও নিয়ে যায় না $HOME
। এবং যাইহোক যাইহোক oc () অনুরোধগুলি উদ্ধৃত করাই সেরা অনুশীলন, যদি তারা স্পেস দিয়ে কিছু আউটপুট দেয় (তবে এই আদেশটি এই ক্ষেত্রে আসবে না)।
$PWD
। এই উদাহরণটি এর $PWD
পরিবর্তে গিটের মূল সম্পর্কিত সমাধান করবে realpath $PWD
।
বর্তমান গিট রুট ডিরেক্টরিটির পরম পাথ গণনা করতে, শেল স্ক্রিপ্টে ব্যবহারের জন্য বলুন, রিডলিংক এবং গিট রেভ-পার্সের এই সমন্বয়টি ব্যবহার করুন:
gitroot=$(readlink -f ./$(git rev-parse --show-cdup))
git-rev-parse --show-cdup
আপনার সিডব্লিউডি থেকে মূলটিতে পৌঁছানোর জন্য আপনাকে ".." এর সঠিক সংখ্যা বা আপনি যদি শূন্যে থাকেন তবে খালি স্ট্রিং দেয়। তারপরে খালি স্ট্রিংয়ের কেস এবং ব্যবহারের জন্য "./" প্রিপেন্ড করুন
readlink -f
পুরো পথে অনুবাদ করতে ।
আপনি git-root
এই কৌশলটি প্রয়োগ করতে শেল স্ক্রিপ্ট হিসাবে আপনার PATH এ একটি আদেশও তৈরি করতে পারেন:
cat > ~/bin/git-root << EOF
#!/bin/sh -e
cdup=$(git rev-parse --show-cdup)
exec readlink -f ./$cdup
EOF
chmod 755 ~/bin/git-root
(গিট-রুট তৈরি করতে এবং এক্সিকিউট বিট সেট করতে উপরেরগুলি টার্মিনালে আটকানো যেতে পারে; আসল স্ক্রিপ্টটি 2, 3 এবং 4 লাইনে রয়েছে)
এবং তারপরে আপনি git root
আপনার বর্তমান গাছের মূল পেতে চালাতে সক্ষম হবেন । নোট করুন যে শেল স্ক্রিপ্টে, শেল স্ক্রিপ্টে শেলটি প্রস্থান করতে "-e" ব্যবহার করুন যদি রেভ-পার্স ব্যর্থ হয় যাতে আপনি গিট ডিরেক্টরিতে না থাকলে আপনি সঠিকভাবে প্রস্থান স্থিতি এবং ত্রুটি বার্তাটি পেতে পারেন।
"$(git rev-parse ...)"
হ্যাকের পরিবর্তে ব্যবহার করুন ./$(git rev-parse ...)
।
অন্যরা যেমন উল্লেখ করেছে, সমাধানের মূলটি ব্যবহার করা git rev-parse --show-cdup
। যাইহোক, সম্বোধন করার জন্য কয়েকটি এজ কেস রয়েছে:
যখন cwd ইতিমধ্যে কার্যকারী গাছের মূল হয়, কমান্ডটি একটি খালি স্ট্রিং দেয়।
প্রকৃতপক্ষে এটি একটি খালি লাইন তৈরি করে, তবে কমান্ড প্রতিস্থাপনের স্ট্র্যাপটি শেষের লাইনের ব্রেকটি বন্ধ করে দেয়। চূড়ান্ত ফলাফলটি একটি খালি স্ট্রিং।
বেশিরভাগ উত্তরগুলি আউটপুটটি প্রিডেন্ট করার পরামর্শ দেয় ./
যাতে "./"
খাওয়ানোর আগে একটি খালি আউটপুট হয়ে যায় cd
।
GIT_WORK_TREE যখন এমন কোনও স্থানে সেট করা থাকে যা সিডব্লিউডের পিতামাতার নয়, আউটপুটটি একটি পরম পথের নাম হতে পারে।
প্রস্তুতি ./
এই পরিস্থিতিতে ভুল। যদি ./
কোনও পরম পথে অগ্রসর হয়, তবে এটি একটি আপেক্ষিক পাথ হয়ে যায় (এবং সিডব্লুডির সিস্টেমের মূল ডিরেক্টরি যদি তারা কেবল একই অবস্থানের দিকে থাকে)।
আউটপুটটিতে সাদা স্থান থাকতে পারে।
এটি সত্যই কেবল দ্বিতীয় ক্ষেত্রে প্রযোজ্য, তবে এটির একটি সহজ সমাধান রয়েছে: কমান্ড প্রতিস্থাপনের (এবং মানটির পরবর্তী কোনও ব্যবহার) চারপাশে ডাবল উদ্ধৃতি ব্যবহার করুন।
অন্যান্য উত্তর হিসাবে উল্লেখ করা হয়েছে, আমরা করতে পারেন cd "./$(git rev-parse --show-cdup)"
, তবে এটি দ্বিতীয় প্রান্তের ক্ষেত্রে (এবং তৃতীয় প্রান্তের কেস যদি আমরা দ্বিগুণ উদ্ধৃতি ছেড়ে দেয়) বিরতি দেয়।
অনেকগুলি শেল cd ""
নো-অপ্প হিসাবে বিবেচিত হয়, সুতরাং সেই শেলগুলির জন্য আমরা করতে পারতাম cd "$(git rev-parse --show-cdup)"
(ডাবল কোটগুলি প্রথম প্রান্তের ক্ষেত্রে খালি স্ট্রিংটিকে একটি যুক্তি হিসাবে রক্ষা করে এবং তৃতীয় প্রান্তের ক্ষেত্রে সাদা স্থানকে সংরক্ষণ করে)। পসিক্স এর ফলাফল বলেcd ""
অনির্দিষ্ট। তাই এই ধারণাটি করা এড়ানো ভাল।
উপরের সমস্ত ক্ষেত্রে কার্যকর হওয়া একটি সমাধানের জন্য কোনও প্রকারের পরীক্ষা প্রয়োজন। স্পষ্টভাবে সম্পন্ন হয়েছে, এটি দেখতে দেখতে এটির মতো হতে পারে:
cdup="$(git rev-parse --show-cdup)" && test -n "$cdup" && cd "$cdup"
কোন cd
প্রথম প্রান্ত ক্ষেত্রে জন্য সম্পন্ন করা হয়।
যদি cd .
প্রথম প্রান্তের মামলাটি চালানো গ্রহণযোগ্য হয় তবে পরামিতিটির প্রসারণে শর্তসাপেক্ষ কাজটি করা যেতে পারে:
cdup="$(git rev-parse --show-cdup)" && cd "${cdup:-.}"
git root
আপনি উপরের যে উত্তরটি ব্যবহার করছেন কেবলমাত্র "গিট কনফিগারেশন - গ্লোবাল - এ্যাড.আরফে.আরউট '! পিডব্লুডি" "এবং একটি শেল ওরফে গিটরুট =' সিডি 'ব্যবহার করবেন না কেন?
কেবলমাত্র যদি আপনি এই পথটি গিটকেই খাওয়ান তবে ব্যবহার করুন :/
# this adds the whole working tree from any directory in the repo
git add :/
# and is equal to
git add $(git rev-parse --show-toplevel)
সংক্ষিপ্ত সমাধানগুলি যা সাবমডিউলগুলি, হুকগুলিতে এবং এর অভ্যন্তরে কাজ করে .git
ডিরেক্টরিটির
এখানে সবচেয়ে সংক্ষিপ্ত উত্তরটি চাইবে:
r=$(git rev-parse --git-dir) && r=$(cd "$r" && pwd)/ && echo "${r%%/.git/*}"
এটি গিট ওয়ার্কিং ট্রিে ( .git
ডিরেক্টরিতে থাকা অভ্যন্তরীণ) যে কোনও জায়গায় কাজ করবে তবে ধরে নিবে যে সংগ্রহস্থল ডিরেক্টরি (গুলি) বলা হয় .git
(যা পূর্বনির্ধারিত)। সাবমডিউলগুলি সহ, এটি বহিরাগততম রিপোজিটরির মূলের দিকে যাবে।
আপনি যদি বর্তমান সাবমডিউল ব্যবহারের মূলে যেতে চান তবে:
echo $(r=$(git rev-parse --show-toplevel) && ([[ -n $r ]] && echo "$r" || (cd $(git rev-parse --git-dir)/.. && pwd) ))
সহজেই আপনার submodule রুট একটি কমান্ডটি চালাবার অধীনে [alias]
আপনার .gitconfig
যোগ করুন:
sh = "!f() { root=$(pwd)/ && cd ${root%%/.git/*} && git rev-parse && exec \"$@\"; }; f"
এটি আপনাকে সহজেই পছন্দ মতো কাজ করতে দেয় git sh ag <string>
শক্তিশালী সমাধান যা আলাদাভাবে নামযুক্ত বা বাহ্যিক .git
বা $GIT_DIR
ডিরেক্টরিগুলি সমর্থন করে ।
দ্রষ্টব্য যে $GIT_DIR
বাহ্যিক কোথাও নির্দেশ করতে পারে (এবং কল করা হয় না).git
), সুতরাং আরও তদন্তের প্রয়োজন।
এটি আপনার মধ্যে রাখুন .bashrc
:
# Print the name of the git working tree's root directory
function git_root() {
local root first_commit
# git displays its own error if not in a repository
root=$(git rev-parse --show-toplevel) || return
if [[ -n $root ]]; then
echo $root
return
elif [[ $(git rev-parse --is-inside-git-dir) = true ]]; then
# We're inside the .git directory
# Store the commit id of the first commit to compare later
# It's possible that $GIT_DIR points somewhere not inside the repo
first_commit=$(git rev-list --parents HEAD | tail -1) ||
echo "$0: Can't get initial commit" 2>&1 && false && return
root=$(git rev-parse --git-dir)/.. &&
# subshell so we don't change the user's working directory
( cd "$root" &&
if [[ $(git rev-list --parents HEAD | tail -1) = $first_commit ]]; then
pwd
else
echo "$FUNCNAME: git directory is not inside its repository" 2>&1
false
fi
)
else
echo "$FUNCNAME: Can't determine repository root" 2>&1
false
fi
}
# Change working directory to git repository root
function cd_git_root() {
local root
root=$(git_root) || return 1 # git_root will print any errors
cd "$root"
}
টাইপ করে এটি সম্পাদন করুন git_root
(আপনার শেলটি পুনরায় চালু করার পরে exec bash
:)
(root=$(git rev-parse --git-dir)/ && cd ${root%%/.git/*} && git rev-parse && pwd)
তবে এটি বাহ্যিক $GIT_DIR
বিষয়গুলি কভার করে না যা অন্য .git
আপনি cd
যদি কোনও গির্স দির না থেকে থাকেন তবে এটি করার জন্য যদি কোনও ভাল আলিফের সন্ধান করেন তবে:
alias ..g='git rev-parse && cd "$(git rev-parse --show-cdup)"'
git-extras
জোড়ে $ git root
দেখতে https://github.com/tj/git-extras/blob/master/Commands.md#git-root
$ pwd
.../very-deep-from-root-directory
$ cd `git root`
$ git add . && git commit
$ brew install git-extras
$ apt-get install git-extras
এই শেল ওরফে আপনি গিট সাবডিরে বা শীর্ষ স্তরে থাকুক না কেন তা কাজ করে:
alias gr='[ ! -z `git rev-parse --show-toplevel` ] && cd `git rev-parse --show-toplevel || pwd`'
ব্যাকটিকসের পরিবর্তে আধুনিক সিনট্যাক্স ব্যবহার করতে আপডেট হয়েছে:
alias gr='[ ! -z $(git rev-parse --show-toplevel) ] && cd $(git rev-parse --show-toplevel || pwd)'
alias git-root='cd \`git rev-parse --git-dir\`; cd ..'
অন্য সমস্ত কিছু হ'ল ডিরেক্টরি ডিরেক্টরিতে গিয়ে বা কেবল খারাপভাবে ব্যর্থ হয় point এটি GIT_DIR এ ফিরে যাওয়ার দ্রুত এবং সংক্ষিপ্ততম উপায়।
$GIT_DIR
ওয়ার্কট্রি ব্যবহার করে আলাদা করা হয় । ফলস্বরূপ এটি সাবমডিউলগুলির জন্যও ব্যর্থ হয়, যেখানে রয়েছে । .git
gitdir: SOMEPATH
$GIT_DIR
.git/modules/SUBMODULEPATH
এখানে এমন একটি স্ক্রিপ্ট রয়েছে যা আমি লিখেছি যা উভয় ক্ষেত্রে পরিচালনা করে: 1) একটি ওয়ার্কস্পেসের সাহায্যে সংগ্রহস্থল, 2) খালি সংগ্রহস্থল।
https://gist.github.com/jdsumsion/6282953
git-root
(আপনার পথে নির্বাহযোগ্য ফাইল):
#!/bin/bash
GIT_DIR=`git rev-parse --git-dir` &&
(
if [ `basename $GIT_DIR` = ".git" ]; then
# handle normal git repos (with a .git dir)
cd $GIT_DIR/..
else
# handle bare git repos (the repo IS a xxx.git dir)
cd $GIT_DIR
fi
pwd
)
আশা করি এটি সহায়ক।
git exec
ধারণাটি নন-বেয়ার স্টোরগুলিতে আরও বেশি সহায়ক। তবে, আমার উত্তরের এই লিপিটি খালি বনাম, নন-বেয়ার কেসটি সঠিকভাবে পরিচালনা করে, যা কারওর পক্ষে কার্যকর হতে পারে, তাই আমি এই উত্তরটি এখানে রেখে দিচ্ছি।
git submodule
যেখানে $GIT_DIR
এর মতো কিছু থাকে /.git/modules/SUBMODULE
। এছাড়াও আপনি ধরে নিতে পারেন যে .git
ডিরেক্টরিটি নন-বেয়ার ক্ষেত্রে ওয়ার্কট্রি-র অংশ।
$ git config alias.root '!pwd'
# then you have:
$ git root
[alias] findroot = "!f () { [[ -d ".git" ]] && echo "Found git in [
pwd ]" && exit 0; cd .. && echo "IN
pwd" && f;}; f"
git config --global alias.root '!pwd'
কাজ করে। অ-বৈশ্বিক ভেরিয়েন্টে এটি ভিন্নভাবে কাজ করে এমন কোনও ক্ষেত্রে আমি স্পট করতে সক্ষম হয়েছি। (ইউনিক্স, গিট 1.7.10.4) বিটিডাব্লু: আপনার একটি অন্তহীন পুনরাবৃত্তি এড়াতে একটি findroot
প্রয়োজন /.git
।
যেহেতু গীত 2.13.0 , এটা মূল প্রকল্প, এমনকি কাজ করে যখন একটি submodule ভিতর থেকে ব্যবহৃত হচ্ছে পথ দেখানোর জন্য একটি নতুন বিকল্প সমর্থন করে:
git rev-parse --show-superproject-working-tree
আপনি যদি শেল ফ্রেমওয়ার্ক ব্যবহার করেন তবে ইতিমধ্যে শেল ওরফে উপলব্ধ থাকতে পারে:
$ grt
মধ্যে উহু-মাই-zsh (68k) ( cd $(git rev-parse --show-toplevel || echo ".")
)$ git-root
মধ্যে prezto (8.8k) (প্রদর্শন কাজ গাছ রুট পথ)$ g..
জিমফডব্লিউ (1 কে) (বর্তমান ডিরেক্টরিটি কার্যকারী গাছের শীর্ষ স্তরে পরিবর্তন করে))আমি ড্যানিয়েল ব্রকম্যানের দুর্দান্ত মন্তব্যের উপর প্রসারিত করতে চেয়েছিলাম।
সংজ্ঞা git config --global alias.exec '!exec '
আপনি মত কাজগুলি করতে পারবেন git exec make
কারণ, যেমন man git-config
পদ বলে:
যদি উলামের সম্প্রসারণটি বিস্মৃতকরনের সাথে উপসর্গ করা হয় তবে এটি শেল কমান্ড হিসাবে বিবেচিত হবে। [...] নোট করুন যে শেল কমান্ডগুলি কোনও সংগ্রহস্থলের শীর্ষ স্তরের ডিরেক্টরি থেকে কার্যকর করা হবে যা সম্ভবত বর্তমান ডিরেক্টরি হতে পারে না।
এটি $GIT_PREFIX
কোনও সংগ্রহস্থলের শীর্ষ স্তরের ডিরেক্টরি সম্পর্কিত ডিরেক্টরি বর্তমান ডিরেক্টরি হতে পারে তা জানাও সহজ নয়। তবে, এটি জানা মাত্র যুদ্ধের অর্ধেক ™ শেল পরিবর্তনশীল প্রসারণ এটি ব্যবহার করা বরং শক্ত করে তোলে। সুতরাং আমি এর bash -c
মতো ব্যবহার করার পরামর্শ দিচ্ছি :
git exec bash -c 'ls -l $GIT_PREFIX'
অন্যান্য কমান্ডের মধ্যে রয়েছে:
git exec pwd
git exec make
git
এক্সিকিউটেবলের প্রয়োজন ছাড়াই কারও কাছে এটি করার কোনও পসিক্স অনুগত পদ্ধতি প্রয়োজন :
#$1: Path to child directory
git_root_recurse_parent() {
# Check if cwd is a git root directory
if [ -d .git/objects -a -d .git/refs -a -f .git/HEAD ] ; then
pwd
return 0
fi
# Check if recursion should end (typically if cwd is /)
if [ "${1}" = "$(pwd)" ] ; then
return 1
fi
# Check parent directory in the same way
local cwd=$(pwd)
cd ..
git_root_recurse_parent "${cwd}"
}
git_root_recurse_parent
আপনি যদি কোনও স্ক্রিপ্টের অংশ হিসাবে কেবল কার্যকারিতা চান তবে শেবাংটি সরান এবং এর git_root_recurse_parent
সাথে শেষ লাইনটি প্রতিস্থাপন করুন :
git_root() {
(git_root_recurse_parent)
}
if
বিবৃতিতে আপনি পুনর্বার ডিরেক্টরিতে ডিরেক্টরি পরিবর্তন করেছেন কিনা তা যাচাইয়ের কথা ছিল। যদি এটি একই ডিরেক্টরিতে থেকে যায় তবে ধরে নেওয়া যায় আপনি কোথাও আটকে আছেন (উদাঃ /
), এবং ব্রেক পুনরাবৃত্তি। বাগ ঠিক করা হয়েছে, এবং এখন প্রত্যাশা অনুযায়ী কাজ করা উচিত। এটা ইশারা জন্য ধন্যবাদ।
আজ এটি সমাধান করতে হবে। কোনও প্রোগ্রামের জন্য এটির প্রয়োজন হিসাবে এটি সি # তে সলভ করা হয়েছে, তবে আমার ধারণা এটি অবশ্যই পুনরায় লেখা যেতে পারে। এই পাবলিক ডোমেন বিবেচনা করুন।
public static string GetGitRoot (string file_path) {
file_path = System.IO.Path.GetDirectoryName (file_path);
while (file_path != null) {
if (Directory.Exists (System.IO.Path.Combine (file_path, ".git")))
return file_path;
file_path = Directory.GetParent (file_path).FullName;
}
return null;
}