এক কমান্ডে গিট রুট ডিরেক্টরি পাওয়ার কী উপায় আছে?


669

মার্চুরিয়ালের মাধ্যমে মূল ডিরেক্টরিটি মুদ্রণের একটি উপায় রয়েছে (এতে .hg রয়েছে)

hg root

.Git ডিরেক্টরি রয়েছে এমন ডিরেক্টরি পাওয়ার জন্য কি গিটের সমতুল্য কিছু রয়েছে?


এমিল ভাল স্ক্রিপ্ট। আমি স্ক্রিপ্টটি অনলাইনে উপলভ্য করে দিয়েছি এবং সম্ভাবনাটিকে কোনও ফাইল / ডিরেক্টরি যুক্তি হিসাবে যুক্ত করার অনুমতি দিয়েছি। github.com/Dieterbe/git-scriptts/commit/…
ডাইটার_বে

আগ্রহী বা অনুসন্ধানী কারও জন্য bzr rootবাজারে প্রচুর ব্যবহৃত হয়েছিল
ক্রিস্টোফার আইভেস

দয়া করে 'জিসিডি'-র নোটটি নিন : গিট- আওয়ার ' সিডি ' জেটওয়ার্কস.আর.নোড / ৫২ -স্বতঃ-সমাপ্তির সাথে রিপোজিটরি রুটের সাথে সম্পর্কিত
মিশা উইডেনম্যান


1
@ মিচাওয়েডেনম্যান: লিঙ্কটি মারা গেছে।
d33tah

উত্তর:


1111

হ্যাঁ:

git rev-parse --show-toplevel

আপনি যদি আরও সরাসরি গিট কমান্ডটির অনুলিপি করতে চান তবে আপনি একটি নাম রাখতে পারেন :

git config --global alias.root 'rev-parse --show-toplevel'

এবং এখন git rootঠিক যেমন কাজ করবে hg root


নোট : একটি submodule এই রুট ডিরেক্টরিটি প্রদর্শন করা হবে submodule এবং না পিতা বা মাতা সংগ্রহস্থল। আপনি যদি গিট> = 2.13 বা ততোধিক ব্যবহার করে থাকেন তবে এমন একটি উপায় রয়েছে যা সাবমডিউলগুলি সুপারপোজেক্টের মূল ডিরেক্টরিটি দেখায়। যদি আপনার গিটটি তার চেয়ে বেশি পুরানো হয় তবে এই অন্য উত্তরটি দেখুন।


148
আমি সর্বদা সংজ্ঞায়িত করি git config --global alias.exec '!exec 'যাতে আমি পছন্দ মতো জিনিসগুলি করতে পারি git exec make। এটি কাজ করে কারণ শেল এলিয়াসগুলি সর্বদা শীর্ষ-স্তরের ডিরেক্টরিতে কার্যকর করা হয়।
ড্যানিয়েল ব্রকম্যান

8
এটি কি hg rootকরে। এটি আপনার পরীক্ষিত আউটপুটগুলির শীর্ষ-স্তরের ডিরেক্টরি ছাপিয়ে দেয়। এটি আপনাকে এতে স্যুইচ করে না (এবং বর্তমান ডিরেক্টরি এবং আপনার শেলটির পুরো ধারণাটি কীভাবে ইন্টারঅ্যাক্ট করে তার কারণ এটি এটি করতে পারে নি)।
সর্বময়ী

14
এই সমাধান সহ সামান্য সাবধান - এটি যে কোনও প্রতীকী লিঙ্কগুলি অনুসরণ করবে। সুতরাং, আপনি যদি উপস্থিত থাকেন ~/my.proj/foo/barএবং এতে ~/my.projসিমিলিং করা থাকে ~/src/my.projতবে উপরের কমান্ডটি আপনাকে সরিয়ে দেবে ~/src/my.proj। সমস্যা হতে পারে, এরপরে আপনি যা কিছু করতে চান তা গাছ অজিনস্টিক নয়।
ফ্রেঞ্চি পেনভ

3
গিট হুকের মধ্যে থেকে আমি কীভাবে এটি ব্যবহার করতে পারি? বিশেষত, আমি একটি সংযুক্তির পরে একটি হুক করছি এবং আমার স্থানীয় গিট রেপোর আসল মূল ডিরেক্টরিটি পাওয়া দরকার।
ডেরেক

12
এই সমাধানটি (এবং এই পৃষ্ঠার আরও অনেকে যা আমি চেষ্টা করেছি) গিট হুকের অভ্যন্তরে কাজ করে না। আরও সুনির্দিষ্টভাবে বলতে গেলে, আপনি প্রকল্পের .gitডিরেক্টরিতে থাকা অবস্থায় এটি কাজ করে না ।
ডেনিস

97

manজন্য পৃষ্ঠা git-config(অধীনে ওরফে ) বলেছেন:

যদি উলামের সম্প্রসারণটি বিস্মৃতকরনের সাথে উপসর্গ করা হয় তবে এটি শেল কমান্ড হিসাবে বিবেচিত হবে। [...] নোট করুন যে শেল কমান্ডগুলি কোনও সংগ্রহস্থলের শীর্ষ স্তরের ডিরেক্টরি থেকে কার্যকর করা হবে যা সম্ভবত বর্তমান ডিরেক্টরি হতে পারে না।

সুতরাং, ইউনিক্সে আপনি এটি করতে পারেন:

git config --global --add alias.root '!pwd'

2
সুতরাং, যদি আপনার কাছে "গিট রুট" কমান্ড থাকে তবে আপনি কীভাবে এটি একটি উপনামে রাখতে পারেন? যদি আমি এটি আমার মধ্যে রাখি .zshrcএবং আমি `ওরফে সিজি =" সিডি $ (গিট রুট) "সংজ্ঞায়িত করেছি, তবে $ () অংশটি উত্স-সময়ে মূল্যায়ন হয় এবং সর্বদা ~ / ডটফাইলে নির্দেশ করে, যেখানে আমার zshrc ।
জেল্ক

2
@Cormacrelf আপনি এটি শেল ওরফে রাখবেন না। আপনি এটিকে শেল ফাংশন বা স্ক্রিপ্টে রাখতে পারেন।
কনরাড মায়ার

4
@ কোরম্যাক্রেল্ফ এটিকে ডাবল কোটগুলির পরিবর্তে একক উদ্ধৃতিতে রাখুন, তারপরে এটি সংজ্ঞা সময়ে নয়, রানটাইমে প্রসারিত হবে।
ক্লেক

3
পছন্দ করেছেন সুতরাং আপনি এটি বাইরে রেপো কি আশা করবেন?
অ্যালোস মাহডাল

1
@ অলিসমহদাল আসলে আমার জন্য এটি কোনও রেপোর বাইরে ব্যর্থ হয় না, এটি কেবল সিডাব্লুডির প্রতিবেদন করে।
justinpitts

90

হয়েছে --show-toplevelশুধুমাত্র সম্প্রতি যোগ করাgit rev-parse বা কেন কেউ এটা উল্লেখ করা হয়?

থেকে git rev-parseমানুষ পৃষ্ঠা:

   --show-toplevel
       Show the absolute path of the top-level directory.

1
এই বিষয়টি চিহ্নিত করার জন্য ধন্যবাদ; আপনার সহায়তা ব্যতীত, আমার পক্ষে এটি অনুমান করা কঠিন হবে git-rev-parse- কারণ এটির নামটি এটি পুনর্বিবেচনার স্পেসিফিকেশনগুলি প্রক্রিয়াকরণের বিষয়ে প্রস্তাবিত করে। বিটিডাব্লু, আমি এর git --work-treeমতো কাজ দেখে খুশি হব git --exec-path[=<path>]: "যদি কোনও পথ না দেওয়া হয়, তবে গিটটি বর্তমান সেটিংস মুদ্রণ করবে"; কমপক্ষে, আইএমও, এই জাতীয় বৈশিষ্ট্যটি অনুসন্ধান করার জন্য এটি কোনও যৌক্তিক জায়গা হবে।
ইম্জ - ইভান জাখারিয়াশেভ

4
বিশেষত, আপনি root = rev-parse --show-toplevelআপনার গিটকনফিগে উপনাম করতে পারেন ।
যান্ত্রিক শামুক

2
অন্য কথায়, আপনি করতে পারেন git config --global alias.root "rev-parse --show-toplevel"এবং তারপরে git rootকাজটি করতে সক্ষম হবেন
ননপোলারিটি

git rev-parse --show-toplevelআমি যখন সাব-মডিউলটিতে চেষ্টা করেছিলাম তখন @ রায়ান দ্য ল্যাচ কাজ করে। এটি গিট সাবমডিউলের মূল ডির ছাপায়। এটি আপনার জন্য কী মুদ্রণ করে?
উইসবাকি

2
আমি কেন বিভ্রান্ত হয়েছিলাম কেন এই উত্তরটি শীর্ষের উত্তরটিকে সদৃশ করেছিল। সক্রিয় আউট উপরের উত্তর থেকে সম্পাদিত হয়েছে --show-cdupথেকে --show-top-levelফেব্রুয়ারী 2011 সালে (পরে এই উত্তরটি জমা ছিল)।
উইসবাকী

54

কেমন "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) সাথে আছেন


3
ওহ অপেক্ষা করুন, এটি নিকটে ছিল তবে এটি আসল .git দির পায়, গিট রেপোর ভিত্তি নয়। এছাড়াও .git ডিরেক্টরিটি অন্য কোথাও হতে পারে, সুতরাং আমি ঠিক এটি খুঁজছিলাম না।
ওয়াজো

2
ঠিক আছে, আমি এখন দেখছি আপনি আসলে যা খুঁজছিলেন। - শো-সিডিআপ তখন আরও উপযুক্ত। দুটি বিকল্পের মধ্যে পার্থক্য বর্ণনা করার জন্য আমি আমার উত্তরটি রেখেছি।
ভোনসি

2
এটি প্রদর্শিত হবে যে .gitআপনি যদি ইতিমধ্যে মূল ডিরেক্টরিতে থাকেন তবে এই কমান্ডটি একটি আপেক্ষিক পথ দেয় gives (কমপক্ষে, এটি এমএসজিগিতে করে))
ব্লেয়ার হলোয়ে

2
+1, এটিই কেবলমাত্র উত্তর যা "ওপরে নিজেই" .git ডিরেক্টরি অন্য কোথাও থাকতে পারে "বলে উল্লেখ করে মজাদার," .git ডিরেক্টরি সম্বলিত ডিরেক্টরিটি পান? "এর মূল প্রশ্নের উত্তর দেয়।
ফাবিয়েনআান্ড্রে

1
এটিই একমাত্র সমাধান যা উইন্ডোজে কাজ করে এবং গিট সাবমডিউলগুলি ব্যবহার করার সময় পার্সেবল ফলাফল দেয় (উদাঃ সি: os সংগ্রহস্থলগুলি \ মাইরেপো g এটি এটিকে সবচেয়ে শক্তিশালী সমাধান করে তোলে বিশেষত পুনরায় ব্যবহারযোগ্য স্ক্রিপ্টে।
খ্রিস্টালি

36

এখানে একটি সহজ উত্তর লিখতে, যাতে আমরা ব্যবহার করতে পারি

git root

কাজটি করার জন্য, কেবল নিজের গিটটি ব্যবহার করে কনফিগার করুন

git config --global alias.root "rev-parse --show-toplevel"

এবং তারপরে আপনি নিম্নলিখিতগুলিতে আপনার যুক্ত করতে পারেন ~/.bashrc:

alias cdroot='cd $(git root)'

যাতে আপনি কেবল cdrootআপনার রেপুর শীর্ষে যেতে ব্যবহার করতে পারেন।


খুব সুন্দর! চূড়ান্ত সুবিধাজনক!
স্ক্র্যাভি

একটি দুর্দান্ত উত্তর, আপনাকে ধন্যবাদ!
এআর্ফ

26

আপনি যদি ইতিমধ্যে শীর্ষ স্তরে থাকেন বা গিট সংগ্রহস্থলে না থাকেন তবে cd $(git rev-parse --show-cdup)আপনাকে ঘরে নিয়ে যাবে (কেবল সিডি)। cd ./$(git rev-parse --show-cdup)এটি ঠিক করার এক উপায়।


7
আরেকটি বিকল্প এটা উদ্ধৃত করা হল: cd "$(git rev-parse --show-cdup)"। এটি কাজ করে কারণ cd ""আপনাকে পিছনের চেয়ে কোথাও নিয়ে যায় না $HOME। এবং যাইহোক যাইহোক oc () অনুরোধগুলি উদ্ধৃত করাই সেরা অনুশীলন, যদি তারা স্পেস দিয়ে কিছু আউটপুট দেয় (তবে এই আদেশটি এই ক্ষেত্রে আসবে না)।
ctrueden

আপনি যদি একটি সিমলিংকের মাধ্যমে ডিরেক্টরিটি আপনার গিট রেপোতে পরিবর্তন করেন তবে এই উত্তরটি ভাল কাজ করে । আপনার গিট রেপো যখন একটি সিমিলিংকের নীচে থাকে তখন অন্যান্য কিছু উদাহরণ প্রত্যাশার মতো কাজ করে না কারণ তারা বাশ-এর ​​সাথে সম্পর্কিত গিটের মূল ডিরেক্টরিটি সমাধান করে না $PWD। এই উদাহরণটি এর $PWDপরিবর্তে গিটের মূল সম্পর্কিত সমাধান করবে realpath $PWD
ড্যামিয়েন Ó সিয়ালাইঘ

16

বর্তমান গিট রুট ডিরেক্টরিটির পরম পাথ গণনা করতে, শেল স্ক্রিপ্টে ব্যবহারের জন্য বলুন, রিডলিংক এবং গিট রেভ-পার্সের এই সমন্বয়টি ব্যবহার করুন:

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" ব্যবহার করুন যদি রেভ-পার্স ব্যর্থ হয় যাতে আপনি গিট ডিরেক্টরিতে না থাকলে আপনি সঠিকভাবে প্রস্থান স্থিতি এবং ত্রুটি বার্তাটি পেতে পারেন।


2
যদি গিট "রুট" ডিরেক্টরি পথে ফাঁকা স্থান থাকে তবে আপনার উদাহরণগুলি ভেঙে যাবে। সর্বদা "$(git rev-parse ...)"হ্যাকের পরিবর্তে ব্যবহার করুন ./$(git rev-parse ...)
মিক্কো রেন্টালাইনেন

readlink -fবিএসডি তে একই রকম কাজ করে না। কাজের জন্য এই এসও দেখুন । পাইথন উত্তর সম্ভবত কিছু ইনস্টল না করে কাজ করবে: python -c 'import os, sys; print(os.path.realpath(sys.argv[1]))' "$(git rev-parse --show-cdup)"
ব্লু

16

অন্যরা যেমন উল্লেখ করেছে, সমাধানের মূলটি ব্যবহার করা git rev-parse --show-cdup। যাইহোক, সম্বোধন করার জন্য কয়েকটি এজ কেস রয়েছে:

  1. যখন cwd ইতিমধ্যে কার্যকারী গাছের মূল হয়, কমান্ডটি একটি খালি স্ট্রিং দেয়।
    প্রকৃতপক্ষে এটি একটি খালি লাইন তৈরি করে, তবে কমান্ড প্রতিস্থাপনের স্ট্র্যাপটি শেষের লাইনের ব্রেকটি বন্ধ করে দেয়। চূড়ান্ত ফলাফলটি একটি খালি স্ট্রিং।

    বেশিরভাগ উত্তরগুলি আউটপুটটি প্রিডেন্ট করার পরামর্শ দেয় ./যাতে "./"খাওয়ানোর আগে একটি খালি আউটপুট হয়ে যায় cd

  2. GIT_WORK_TREE যখন এমন কোনও স্থানে সেট করা থাকে যা সিডব্লিউডের পিতামাতার নয়, আউটপুটটি একটি পরম পথের নাম হতে পারে।

    প্রস্তুতি ./এই পরিস্থিতিতে ভুল। যদি ./কোনও পরম পথে অগ্রসর হয়, তবে এটি একটি আপেক্ষিক পাথ হয়ে যায় (এবং সিডব্লুডির সিস্টেমের মূল ডিরেক্টরি যদি তারা কেবল একই অবস্থানের দিকে থাকে)।

  3. আউটপুটটিতে সাদা স্থান থাকতে পারে।

    এটি সত্যই কেবল দ্বিতীয় ক্ষেত্রে প্রযোজ্য, তবে এটির একটি সহজ সমাধান রয়েছে: কমান্ড প্রতিস্থাপনের (এবং মানটির পরবর্তী কোনও ব্যবহার) চারপাশে ডাবল উদ্ধৃতি ব্যবহার করুন।

অন্যান্য উত্তর হিসাবে উল্লেখ করা হয়েছে, আমরা করতে পারেন 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আপনি উপরের যে উত্তরটি ব্যবহার করছেন কেবলমাত্র "গিট কনফিগারেশন - গ্লোবাল - এ্যাড.আরফে.আরউট '! পিডব্লুডি" "এবং একটি শেল ওরফে গিটরুট =' সিডি 'ব্যবহার করবেন না কেন?
জেসন অ্যাকসেলসন

1
একটি উপনাম ব্যবহার করা সম্ভব নাও হতে পারে, উদাহরণস্বরূপ আপনি যদি এটি স্ক্রিপ্ট করতে চান এবং কোনও কাস্টম ওরফে নির্ভর করতে পারেন না।
নীল রঙের

1
সাব মডিউলগুলি অন্য কোণার কেস।
রায়ান দ্য লিচ

14

কেবলমাত্র যদি আপনি এই পথটি গিটকেই খাওয়ান তবে ব্যবহার করুন :/

# 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)

12

সংক্ষিপ্ত সমাধানগুলি যা সাবমডিউলগুলি, হুকগুলিতে এবং এর অভ্যন্তরে কাজ করে .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:)


গিট সংগ্রহস্থলের মূলটি খুঁজে পেতে এই কোডটি রোবস্ট বাশ ফাংশনে কোড-পর্যালোচনা করা হচ্ছে । আপডেটের জন্য সেখানে দেখুন।
টম হেল

খুশী হলাম। আরো জটিল যে কি আমি 7 বছর আগে (প্রস্তাবিত stackoverflow.com/a/958125/6309 ), কিন্তু এখনও এটি +1
VonC

1
এই রেখাগুলিগুলির সাথে সংক্ষিপ্ত সমাধানটি হ'ল: (root=$(git rev-parse --git-dir)/ && cd ${root%%/.git/*} && git rev-parse && pwd)তবে এটি বাহ্যিক $GIT_DIRবিষয়গুলি কভার করে না যা অন্য .git
টম হেল

আমি ভাবছি যদি অ্যাকাউন্টে একাধিক worktrees যে এখন Git মধ্যে সম্ভব মধ্যে 2.5+ (এই নাও stackoverflow.com/a/30185564/6309 )
VonC

"রুটটি খুঁজে পাওয়ার জন্য শক্তিশালী বাশ ফাংশন ..."
--আরিকই

8

"গিট কনফিগারেশন" উত্তরটি কিছুটা সংশোধন করতে:

git config --global --add alias.root '!pwd -P'

এবং পথটি পরিষ্কার করা। খুব সুন্দর.


7

আপনি cdযদি কোনও গির্স দির না থেকে থাকেন তবে এটি করার জন্য যদি কোনও ভাল আলিফের সন্ধান করেন তবে:

alias ..g='git rev-parse && cd "$(git rev-parse --show-cdup)"'

7

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

গিট-অতিরিক্তের প্রাপ্যতা

  • homebrew (OSX) / linuxbrew (লিনাক্সের) $ brew install git-extras
  • ডিবিয়ান / উবুন্টু রেপোস ( https://packages.debian.org/sid/git-extras )$ apt-get install git-extras

6

এই শেল ওরফে আপনি গিট সাবডিরে বা শীর্ষ স্তরে থাকুক না কেন তা কাজ করে:

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)'

5
alias git-root='cd \`git rev-parse --git-dir\`; cd ..'

অন্য সমস্ত কিছু হ'ল ডিরেক্টরি ডিরেক্টরিতে গিয়ে বা কেবল খারাপভাবে ব্যর্থ হয় point এটি GIT_DIR এ ফিরে যাওয়ার দ্রুত এবং সংক্ষিপ্ততম উপায়।


দেখে মনে হচ্ছে 'গিট রেভ-পার্স --git-dir' সবচেয়ে পরিষ্কার সমাধান।
স্টেলেডোগ

3
এটি ব্যর্থ হয়, যখন- ফাইলগুলি এবং $GIT_DIRওয়ার্কট্রি ব্যবহার করে আলাদা করা হয় । ফলস্বরূপ এটি সাবমডিউলগুলির জন্যও ব্যর্থ হয়, যেখানে রয়েছে । .gitgitdir: SOMEPATH$GIT_DIR.git/modules/SUBMODULEPATH
টিনো

5

এখানে এমন একটি স্ক্রিপ্ট রয়েছে যা আমি লিখেছি যা উভয় ক্ষেত্রে পরিচালনা করে: 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
)

আশা করি এটি সহায়ক।


1
কিথ, পরামর্শ দেওয়ার জন্য আপনাকে ধন্যবাদ, আমি স্ক্রিপ্টটি অন্তর্ভুক্ত করেছি।
jdsumsion

আমি আসলে উপরের উত্তরটিকে উঁচু করেছিলাম কারণ বুঝতে পেরেছিলাম যে git execধারণাটি নন-বেয়ার স্টোরগুলিতে আরও বেশি সহায়ক। তবে, আমার উত্তরের এই লিপিটি খালি বনাম, নন-বেয়ার কেসটি সঠিকভাবে পরিচালনা করে, যা কারওর পক্ষে কার্যকর হতে পারে, তাই আমি এই উত্তরটি এখানে রেখে দিচ্ছি।
jdsumsion

1
তবে এটি এর মধ্যে ব্যর্থ হয় git submoduleযেখানে $GIT_DIRএর মতো কিছু থাকে /.git/modules/SUBMODULE। এছাড়াও আপনি ধরে নিতে পারেন যে .gitডিরেক্টরিটি নন-বেয়ার ক্ষেত্রে ওয়ার্কট্রি-র অংশ।
টিনো

4
$ git config alias.root '!pwd'
# then you have:
$ git root

এই উপনামটি বিশ্বব্যাপী ব্যর্থ হবে। পরিবর্তে এটি ব্যবহার করুন (~ / .gitconfig এ): [alias] findroot = "!f () { [[ -d ".git" ]] && echo "Found git in [pwd ]" && exit 0; cd .. && echo "IN pwd" && f;}; f"
ফ্র্যাক্টালস্পেস

ডাউনভোট কেন? দয়া করে কোনও ত্রুটি হাইলাইট করুন বা পরিবর্তে উন্নতির পরামর্শ দিন।
ফ্র্যাক্টালস্পেস

1
আমার জন্য git config --global alias.root '!pwd'কাজ করে। অ-বৈশ্বিক ভেরিয়েন্টে এটি ভিন্নভাবে কাজ করে এমন কোনও ক্ষেত্রে আমি স্পট করতে সক্ষম হয়েছি। (ইউনিক্স, গিট 1.7.10.4) বিটিডাব্লু: আপনার একটি অন্তহীন পুনরাবৃত্তি এড়াতে একটি findrootপ্রয়োজন /.git
টিনো

4

যেহেতু গীত 2.13.0 , এটা মূল প্রকল্প, এমনকি কাজ করে যখন একটি submodule ভিতর থেকে ব্যবহৃত হচ্ছে পথ দেখানোর জন্য একটি নতুন বিকল্প সমর্থন করে:

git rev-parse --show-superproject-working-tree

git-scm.com/docs/… । মজাদার. আমি অবশ্যই এটি মিস করেছি +1
ভোনসি 16'18

3
সতর্কতা যদিও: "বর্তমান সংগ্রহস্থলটি কোনও প্রকল্পের সাব-মডিউল হিসাবে ব্যবহার না করা হলে কিছুই আউটপুট করে না।"
ভোনসি

মন্তব্যের জন্য ধন্যবাদ! আমি এটা খেয়াল করিনি।
জর্ডি ভিলালতা প্রট

2

শেল ফ্রেমওয়ার্কগুলিতে শেল প্রি-কনফিগার করা কনফিগারেশন

আপনি যদি শেল ফ্রেমওয়ার্ক ব্যবহার করেন তবে ইতিমধ্যে শেল ওরফে উপলব্ধ থাকতে পারে:

  • $ grtমধ্যে উহু-মাই-zsh (68k) ( cd $(git rev-parse --show-toplevel || echo "."))
  • $ git-rootমধ্যে prezto (8.8k) (প্রদর্শন কাজ গাছ রুট পথ)
  • $ g.. জিমফডব্লিউ (1 কে) (বর্তমান ডিরেক্টরিটি কার্যকারী গাছের শীর্ষ স্তরে পরিবর্তন করে))

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

1

gitএক্সিকিউটেবলের প্রয়োজন ছাড়াই কারও কাছে এটি করার কোনও পসিক্স অনুগত পদ্ধতি প্রয়োজন :

git-root:

#$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বিবৃতিতে আপনি পুনর্বার ডিরেক্টরিতে ডিরেক্টরি পরিবর্তন করেছেন কিনা তা যাচাইয়ের কথা ছিল। যদি এটি একই ডিরেক্টরিতে থেকে যায় তবে ধরে নেওয়া যায় আপনি কোথাও আটকে আছেন (উদাঃ /), এবং ব্রেক পুনরাবৃত্তি। বাগ ঠিক করা হয়েছে, এবং এখন প্রত্যাশা অনুযায়ী কাজ করা উচিত। এটা ইশারা জন্য ধন্যবাদ।
সোয়াগাল

0

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

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;

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