গিট ডিরেক্টরিতে না থাকলে গিট টানুন


308

ধরা যাক আমার একটি ডিরেক্টরি আছে, /X/Yএটি একটি গিট সংগ্রহস্থল ory git pullভিতরে থেকে কোনওভাবে কমান্ড কল করা কি সম্ভব /X, কিন্তু লক্ষ্যবস্তু/X/Y ডিরেক্টরিকে ?

সম্পাদনা: আমার ধারণা আমি বিশেষভাবে ভাবছিলাম: গিট কমান্ড ব্যবহার করে এটি করা সম্ভব, তবে ডিরেক্টরি পরিবর্তন না করেই?

দ্রষ্টব্য: আমি ভনসির উত্তরটি আগের বিকল্পগুলির চেয়ে অনেক মার্জিত হিসাবে গ্রহণ করেছি । গিটকে ১.৮.৫ এর চেয়ে পুরানো লোকদের জন্য দয়া করে নীচে বিস্টপিয়ারের উত্তরটি দেখুন


2
আমি যুক্ত করতে চাই যে আপনি যখন জিআইT_ডিআরটি সেট না করে হুকের মধ্যে গিট-পুল ব্যবহার করবেন তখন কাজ করবে না। প্রাসঙ্গিক.
zpmorgan

গিট 1.8.5 (Q4 2013) শুরু করে, আপনি "গিট কমান্ড ব্যবহার করতে সক্ষম হবেন, তবে ডিরেক্টরিগুলি পরিবর্তন না করে"। দেখুন নিচের আমার উত্তর
VonC

উত্তর:


453

শুরু হচ্ছে Git 1.8.5 (Q4 ই 2013) , আপনি ", কিন্তু পরিবর্তন ডিরেক্টরি করেও একটি গীত কমান্ড ব্যবহার করা" সক্ষম হবে।

ঠিক যেমন " make -C <directory>", " git -C <directory> ..." গিটকে অন্য কিছু করার আগে সেখানে যেতে বলে

দেখুন 44e1e4 কমিট দ্বারা নাজরি Ramliy :

বর্তমান ডিরেক্টরিটি না রেখে ভিন্ন ডিরেক্টরিতে গিট কমান্ডের আবেদন করতে আরও কীপ্রেস লাগে:

  1. (cd ~/foo && git status)
    git --git-dir=~/foo/.git --work-tree=~/foo status
    GIT_DIR=~/foo/.git GIT_WORK_TREE=~/foo git status
  2. (cd ../..; git grep foo)
  3. for d in d1 d2 d3; do (cd $d && git svn rebase); done

উপরে প্রদর্শিত পদ্ধতিগুলি স্ক্রিপ্টিংয়ের জন্য গ্রহণযোগ্য তবে দ্রুত কমান্ড লাইন অনুরোধগুলির জন্য খুব জটিল।

এই নতুন বিকল্পের সাহায্যে উপরেরটি কয়েকটি কী-স্ট্রোক দিয়ে করা যেতে পারে:

  1. git -C ~/foo status
  2. git -C ../.. grep foo
  3. for d in d1 d2 d3; do git -C $d svn rebase; done

যেহেতু গিট 2.3.4 (মার্চ 2015) এবং কার্তিক নায়ক ( ) দ্বারা 6a536e2 প্রতিশ্রুতিবদ্ধ হয়েছে , খালি হলে " " কোনও বিকল্প হিসাবে বিবেচনা করবে asKarthikNayakgitgit -C '<path>'<path>

' git -C ""' অসহায়ভাবে ত্রুটির সাথে মারা যায় " Cannot change to ''", যদিও শেল সিডিকে "" "নো-অপ্ট হিসাবে বিবেচনা করে।
শেলের আচরণকে নজির হিসাবে গ্রহণ করে, git"-C" কে নো-অপ্ট হিসাবেও আচরণ করতে শেখান ।


4 বছর পরে, গিট 2.23 (Q3 2019) নথিগুলি যে ' git -C ""' কাজ করে এবং ডিরেক্টরি পরিবর্তন করে না

এটি 6a536e2 সাল থেকে এমন আচরণ করছে ( git: " git -C '<path>'" <path>শূন্য অবস্থায় 2015-03-26, গিট ভি 2.3.3.4 হিসাবে " " নো-অফ হিসাবে বিবেচনা করুন)।

এর অর্থ এখনি (শেষ পর্যন্ত) ডকুমেন্টেশনের মধ্যে রয়েছে:

যদি ' <path>' উপস্থিত থাকে তবে খালি থাকে, উদাহরণস্বরূপ -C "", তবে বর্তমান ওয়ার্কিং ডিরেক্টরিটি অপরিবর্তিত রয়েছে।


তুমি দেখতে পার git -C উদাহরণ হিসাবে গিট 2.26 (Q1 2020) এর সাথে ব্যবহার ।

দেখুন b441717 কমিট , 9291e63 কমিট , 5236fce কমিট , কমিট 10812c2 , 62d58cd কমিট , b87b02c কমিট , কমিট 9b92070 , 3595d10 কমিট , f511bc0 কমিট , f6041ab কমিট , f46c243 কমিট , 99c049b কমিট , 3738439 কমিট , কমিট 7717242 , b8afb90 কমিট (20 ডিসেম্বর 2019) দ্বারা ডেন্টন লিউ ( Denton-L)
(দ্বারা একীভূত junio সি Hamano - gitster- মধ্যে কমিট 381e8e9 , 05 ফেব্রুয়ারী 2020)

t1507: সঙ্গতিপূর্ণভাবে full_name()

সাইন-অফ-বাই: ডেন্টন লিউ

আগে, আমরা দৌড় ছিল test_must_fail full_name। তবে, test_must_failকেবল গিট কমান্ড ব্যবহার করা উচিত।
ইনলাইন full_name()যাতে আমরা ব্যবহার করতে পারেন test_must_failউপর gitসরাসরি কমান্ড।

যখন full_name()চালু হয় 28fb84382b ( "পরিচয় দিন <branch>@{upstream}স্বরলিপি", 2009-09-10, গীত v1.7.0-rc0 - একত্রীকরণ ), git -Cবিকল্প নয় প্রাপ্তিসাধ্য এখনো ছিল (যেহেতু চালু হয় 44e1e4d67d ( " git: প্রদত্ত ডিরেক্টরির মধ্যে চালানো -C বিকল্প ", 2013-09-09, গীত v1.8.5-rc0 সাথে - একত্রীকরণ তালিকাভুক্ত ব্যাচ # 5 ))।
ফলস্বরূপ, সহায়ক ফাংশনটি cdপ্রত্যেকবার ম্যানুয়ালি করার প্রয়োজনটিকে সরিয়ে দেয় । যাইহোক, যেহেতু git -Cএখন উপলভ্য, আমরা কেবল এটির পরিবর্তে এবং ইনলাইনটি ব্যবহার করতে পারি full_name()


6
বাহ সুন্দর! এটি উপায়টি আরও মার্জিত, সুতরাং আমি এটি ভবিষ্যতের দর্শকদের জন্য গ্রহণযোগ্য হিসাবে চিহ্নিত করব।
গ্যাভিন অ্যান্ড্রেগ

1
আমার জন্য কাজ করে না: # গিট - রূপান্তর ও & গিট-সি। / .এম 2 / চেকআউট মাস্টার গিট সংস্করণ 1.8.3.4 (অ্যাপল গিট -47) অজানা বিকল্প: -সি ব্যবহার: গিট [- রূপান্তর] [- সহায়তা ] [-সি নাম = মান] [--exec- পাথ [= <पथ>]] [--html- পাথ] [--man-path] [--info- পাথ] [-p | --paginate | --no-পেজার] [--নো-রিপ্লেস-অবজেক্টস] [--বারে] [--git-dir = <पथ>] [- ওয়ার্ক-ট্রি = <पथ>] [--নেমস্পেস = <নাম> ] <কম্যান্ড> [<
অর্গস

7
@ জাঙ্গালিনস্কি তবে আমি "গিট ১.৮.৫" শুরু করার কথা উল্লেখ করেছি। সুতরাং গিট 1.8.3.x এখনও সেই বিকল্পটি সম্পর্কে জানত না।
ভোনসি

2
উবুন্টু 12.04 এ আমাকে একটি নতুন গিট সংস্করণ ইনস্টল করতে হয়েছিল। আমি এটি এর মতো করেছিলাম: apt-get install software-properties-common python-software-propertiesতারপরে গিট রেপো যুক্ত করুন add-apt-repository ppa:git-core/ppa। শেষ ধাপে আপডেট Git করা: apt-get update && apt-get upgrade
ph3nx


54

সম্পাদনা করুন :

এটির সাথে একটি বাগ রয়েছে git pull, বা আপনি যে আদেশটিটি করার চেষ্টা করছেন তা করতে পারবেন না। তবে আপনি এটি আনতে এবং মার্জ করে এটি করতে পারেন :

cd /X
git --git-dir=/X/Y/.git fetch
git --git-dir=/X/Y/.git --work-tree=/X/Y merge origin/master

আসল উত্তর :

ধরে নেওয়া যাক আপনি বাশ বা অনুরূপ চালাচ্ছেন, আপনি এটি করতে পারেন (cd /X/Y; git pull)

Git man পৃষ্ঠা নির্দিষ্ট করে কিছু ভেরিয়েবল (দেখুন "Git সংগ্রহস্থলের প্রয়োগ") যে মনে তারা সাহায্য করা উচিত, কিন্তু আমি তাদের সঠিক (আমার সংগ্রহস্থলের / tmp / ggg2 সঙ্গে) কাজ করতে পারবেন না:

GIT_WORK_TREE=/tmp/ggg2 GIT_DIR=/tmp/ggg2/.git git pull
fatal: /usr/lib/git-core/git-pull cannot be used without a working tree.

আমার সিডব্লিউডি থাকাকালীন নীচে কমান্ডটি চালানো হচ্ছে / টিএমপি আপডেট হয় যেগুলি রেপো করে, তবে আপডেট হওয়া ফাইলটি ওয়ার্কিং ট্রি / টিএমপি / জিজিজি 2 এর পরিবর্তে / tmp এ উপস্থিত হয়:

GIT_DIR=/tmp/ggg2/.git git pull

অনুরূপ প্রশ্নের উত্তরও দেখুন , যা পতাকা --git-dirএবং --work-treeপতাকা প্রদর্শন করে ।


আপনি কি কেবল GIT_WORK_TREE ব্যবহার করে চেষ্টা করেছেন?
অ্যারোমাস্টার

@ অ্যারোমাস্টার: হ্যাঁ, আপনি যদি এটি করেন তবে গিট .gitডিরেক্টরিটি খুঁজে পাবে না ।
bstpierre

ঠিক আছে, ম্যান পেজটি বলে যে GIT_WORK_TREE GIT_DIR সেট না করা থাকলে ব্যবহৃত হয় না। এটা দুজনেই ব্যবহৃত হয় তখন এটি কাজ করে না এমনটি আশ্চর্যজনক বলে মনে হয়।
অ্যারোমাস্টার

@ অ্যারোমাস্টার: আমি ভাবছি যে এখানে কোথাও কোনও বাগ আছে কিনা। আমি যদি করি তবে আমি git --git-dir=/tmp/ggg2/.git --work-tree=/tmp/ggg2 pullএকটি ত্রুটি বার্তা পেয়েছি। তবে আমি git --git-dir=/tmp/ggg2/.git --work-tree=. pull/ টিএমপি থাকাকালীন যদি এটি করি তবে এটি আপডেট হওয়া ফাইলগুলিকে / টিএমপি-তে রাখে।
bstpierre

@bstpierre: আমি ডান এখন ইনস্টল Git সঙ্গে একটি সিস্টেমে অ্যাক্সেস না কিন্তু যদি আমি আমি সঙ্গে অন্যান্য বিকল্প চেষ্টা করা হবে --work-treeমত ডান এখন --work-tree=/tmp/ggg2/এবং --work-tree=/tmp/ggg2/.যেহেতু এটি কিভাবে তার পাথ পার্স নিয়ে একটি সমস্যা হতে পারে।
অ্যারোমাস্টার

32

আপনি এটিকে কোনও ব্যাশ স্ক্রিপ্ট বা গিট ওরফে মুড়ে রাখতে পারেন:

cd /X/Y && git pull && cd -

1
এটি অবশ্যই কৌতুকটি করে তবে আমি ভাবছি ডিরেক্টরিগুলি পরিবর্তন না করে গিট কমান্ড ব্যবহারের কিছু উপায় আছে কিনা। আমি ভাবতে শুরু করি যে সেখানে নেই।
গ্যাভিন অ্যান্ড্রেগ

1
এবং ব্যবহার pushd/popdপরিবর্তে যুগলcd/cd-
axd

অথবা আপনি সিডি পিছনে আটকাতে (cd xyz && git pull)
সাবসেল

30

এই পোস্টটি কিছুটা পুরানো তাই কোনও বাগ থাকতে পারে এবং এটি ঠিক করা হয়েছিল, তবে আমি কেবল এটি করেছি:

git --work-tree=/X/Y --git-dir=/X/Y/.git pull origin branch

এবং এটা কাজ করে. এটি ডটফাইলে এবং পিতামাতার ডিরেক্টরিটি চেয়েছিল তা নির্ধারণ করার জন্য আমাকে এক মিনিট সময় নিয়েছে (একটি মানক সেটআপে তারা সর্বদা পিতা / সন্তানের থাকে তবে সমস্ত সেটআপে থাকে না, তাই তাদের স্পষ্টভাবে নির্দিষ্ট করা দরকার।


আমি এই সমাধানটি পছন্দ করি কারণ এটি \\ রিমোটম্যাচিন \ সি $ \ ফোল্ডার \ ইত্যাদির মতো ডিরেক্টরিগুলির সাথে কাজ করে
twasbrillig

7

আমার কিছু সার্ভার যেমন পুরানো উবুন্টু এলটিএস সংস্করণে রয়েছে, আমি সহজেই গিটকে সর্বশেষ সংস্করণে আপগ্রেড করতে পারি না (যা কিছু উত্তরে বর্ণিত হিসাবে-সি বিকল্পটিকে সমর্থন করে)।

এই কৌশলটি আমার পক্ষে ভাল কাজ করে, বিশেষত কারণ এটির অন্য কোনও উত্তরগুলির পার্শ্ব প্রতিক্রিয়া নেই যা আপনাকে যেখান থেকে শুরু করে সেখান থেকে আলাদা ডিরেক্টরিতে রেখে দেয়।

pushd /X/Y
git pull
popd

বা, এটি ওয়ান-লাইনার হিসাবে করছে:

pushd /X/Y; git pull; popd

লিনাক্স এবং উইন্ডোজ উভয়ই কমান্ড পুশ এবং পপ করেছে।


5

সমন্বয় ব্যবহার করে pushd, git pullএবং popdআমরা এই কার্যকারিতা অর্জন করতে পারেন:

pushd <path-to-git-repo> && git pull && popd

উদাহরণ স্বরূপ:

pushd "E:\Fake Directory\gitrepo" && git pull && popd

এটা চমৎকার. পুরোপুরি কাজ করে
স্ট্রেচ 0

4

আপনি এর মতো স্ক্রিপ্ট লিখতে পারেন:

cd /X/Y
git pull

আপনি এর মত কিছু নাম দিতে পারেন gitpull
আপনি যদি এটির পরিবর্তে স্বেচ্ছাসেবী ডিরেক্টরিগুলি করতে চান তবে /X/Y:

cd $1
git pull

তারপরে আপনি এটিকে gitpull /X/Z
শেষ পর্যন্ত কল করতে পারেন , আপনি সংগ্রহস্থলগুলি সন্ধান করার চেষ্টা করতে পারেন। আমার কাছে একটি ~/gitফোল্ডার রয়েছে যার মধ্যে সংগ্রহস্থল রয়েছে এবং আপনি এটি ব্যবহার করতে পারেন সেগুলি সবগুলি টানতে।

g=`find /X -name .git`
for repo in ${g[@]}
do
    cd ${repo}
    cd ..
    git pull
done

2
আপনি যদি কমান্ড লাইন থেকে এটি করতে চান তবে এটি একটি সাব-শেলের মাধ্যমে করুন : (cd /X/Y && git pull).
ক্যাস্যাবেল

2

আমার মতো যে কেউ রিমোট সার্ভারে ড্রাশ (ড্রুপাল শেল) কমান্ডের মাধ্যমে এটি করার চেষ্টা করছিল, আপনি কার্যনির্বাহী ডিরেক্টরিতে সিডি করার জন্য প্রয়োজনীয় সমাধানটি ব্যবহার করতে পারবেন না:

পরিবর্তে আপনাকে এমন সমাধান ব্যবহার করতে হবে যা আনতে এবং একীভূত করার জন্য ব্রেকটি ভেঙে দেয়:

drush @remote exec git --git-dir=/REPO/PATH --work-tree=/REPO/WORKDIR-PATH fetch origin
drush @remote exec git --git-dir=/REPO/PATH --work-tree=/REPO/WORKDIR-PATH merge origin/branch

1

এটি একটি অনুরূপ সমস্যা হতে পারে তবে আপনি কমান্ডগুলি কেবল চেইনও করতে পারেন। যেমন

এক লাইনে

cd ~/Sites/yourdir/web;git pull origin master

অথবা এসএসএইচ এর মাধ্যমে।

ssh username@atyourserver.com -t "cd ~/Sites/thedir/web;git pull origin master"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.