গিট ক্লোন হওয়ার পরে কীভাবে স্বয়ংক্রিয়ভাবে সিডি করবেন?


37

আমি কিছু করার পরে কমান্ড cdদ্বারা তৈরি ডিরেক্টরিটিতে স্বয়ংক্রিয়ভাবে যেতে চাই।clonegit clone

গুরুত্বপূর্ণ: আমি কমান্ডের জন্য সিনট্যাক্সটি পরিবর্তন করতে চাই না (উদাহরণস্বরূপ একটি নাম / ফাংশন ব্যবহার করুন) কারণ এটি Pretzoপ্রকল্প থেকে আমি স্বয়ংক্রিয়ভাবে প্রাপ্ত zsh- পরিপূর্ণতাগুলি ভেঙে ফেলবে ।

সম্পাদনা : যে কারণে আমি কোনও উত্তর সঠিক হিসাবে গ্রহণ করি নি, কারণ কোনও উত্তর দেওয়া হয়নি যা উপরের শর্তটি মেনে চলেছে।

আমি জেডএসএইচ ব্যবহার করি তবে অন্য কোনও শেলের একটি উত্তরও গ্রহণযোগ্য।


আমি উত্তরটি ইউনিক্স.স্ট্যাকেক্সেঞ্জারিংয়েড / সেকশনস / 20 79 20০২০/২ পছন্দ করি তবে ~/.bashrcফাইলটিতে সেই ফাংশনটি লেখার জন্য এটি উল্লেখ করা দরকার (উদাহরণস্বরূপ) এবং আমার পক্ষে কমপক্ষে এটি কার্যকর হয়নি, প্রতিস্থাপনের সাথে আমার এটি ঠিক করা দরকার লাইন:/usr/bin/git "$@" 2>&1 | tee $tmp
লিস্টারি

উত্তর:


19

একটি ফাংশন তৈরি করুন:

gclonecd() {
  git clone "$1" && cd "$(basename "$1" .git)"
}

(".Git" এর সাথে এবং ছাড়া উভয় লিঙ্কের জন্য কাজ করে)


2
আমি git cloneযদি না ব্যবহার করি তবে আমার যে সমস্ত সরঞ্জামগুলি পরিবর্তন করতে হবে সেগুলির কারণে আমি ব্যবহার চালিয়ে যেতে চাই gitহাব Git যেমন নামে পরিচিত করা হয়েছে, ওহ-মাই-zsh স্বয়ং-সম্পূর্ণতে, ইত্যাদি প্রদান করে ...
ড্যানিয়েল কে

3
@ উইলডিজ gitআপনার শেলের কার্যকরী ডিরেক্টরি পরিবর্তন করতে পারে না, সুতরাং যে কোনও উপায়ে আপনাকে এটিকে একটি উপনাম / ফাংশনে আবদ্ধ করতে হবে যা আপনি যা চান তা করে এটি বিল্টিনের সাথে অনুসরণ করে cd। আপনি যদি hubপরিবর্তে কল করতে চান gitতবে ফাংশনে এটি করুন। আপনি যদি এটি কেবল cloneকমান্ডকে প্রভাবিত করতে চান তবে ফাংশনটির ক্রিয়াটি পরীক্ষা করুন। ইত্যাদি
frostschutz

আমি লক্ষ্য করেছি যে basename git@github.com:pckujawa/pattern-rec.gitপ্যাটার্ন- rec.git- এ ফলাফল আসে - আপনি ক্লোন করলে আপনি কেবল .git বর্ধনটি ছেড়ে দেন?
প্যাট

8
@ প্যাট basenameএকটি প্রত্যয় যুক্তিও নিয়েছে, তাই আপনি এটি করতে পারেন:git clone $1 && cd $(basename $1 .git)
হেনরিক এন

17

git cloneঅতিরিক্ত আর্গুমেন্ট গ্রহণ করে: ডিরেক্টরিটি ব্যবহার করতে। আপনি এটির সাথে বর্তমান ওয়ার্কিং ডিরেক্টরিতে ক্লোন তৈরি করতে পারেন git clone URL . তারপরে, কার্যক্ষম ডিরেক্টরি পরিবর্তন করার দরকার নেই; আপনি ইতিমধ্যে সেখানে আছেন।

আপনি যদি সত্যই gitআদেশটি কার্যকারী ডিরেক্টরি পরিবর্তন করতে চান তবে আপনি এটিকে এমন একটি ফাংশনে পরিবর্তন করতে পারেন যা gitপ্রয়োজনের সময় আসলকে ডাকে :

git()
{
   local tmp=$(mktemp)
   local repo_name

   if [ "$1" = clone ] ; then
     /usr/bin/git "$@" | tee $tmp
     repo_name=$(awk -F\' '/Cloning into/ {print $2}' $tmp)
     rm $tmp
     printf "changing to directory %s\n" "$repo_name"
     cd "$repo_name"
   else
     /usr/bin/git "$@"
   fi
}

আমি ঠিক এটিই খুঁজছিলাম। আমি বুঝতে পারি যে কোনও অভ্যন্তরীণ হুক বা এর মতো কিছু নেই, আমি প্রায় সঠিক ফাংশন লিখেছিলাম :)
ড্যানিয়েল কে।

2
@ উইলডিয়েস হ্যাঁ: /tmpর্যামের পরিমাণ রয়েছে যা কোনও আধুনিক লিনাক্স টিএমপিএফ-এর মাধ্যমে করে। যাইহোক, আপনি ডিস্কে লেখার বিষয়ে কেন চিন্তা করবেন, যখন আপনি কেবল একটি গিট ক্লোন করেছেন, যা ডিরেক্টরি তৈরি করে এবং সম্ভবত ডিস্কে শত শত ফাইল লিখে যায় ...
কাজা

1
আপনি সম্ভবত পুরো "এনভিএম এটি ডিস্কে লিখলে" জিনিসটি সম্পর্কে ঠিক বলেছেন, আমি কেবল অতিরিক্ত ক্রিয়াকলাপগুলি সন্ধান করতে চাইছিলাম। অনেক ধন্যবাদ কাজ।
ড্যানিয়েল কে।

3
সাবধান হও. এটি git [flags] command [arguments]তাই অন্ধভাবে cloneনির্দিষ্ট অবস্থানের জন্য জিজ্ঞাসা ব্যর্থ হবে।
ভনব্র্যান্ড

1
"বাস্তব" পথ সহায়তা যুক্ত করবেন? পছন্দ: git_real_home = which git git () {... it git_real_home "$ @" | টি
টেম্পে

7

আপনি যদি রেপোর স্থানীয় নাম সরবরাহ করেন তবে $ _ :

git clone git@github.com:npm/npm.git npm-local-dir && cd $_

তবে আপনি যদি দীর্ঘ নামগুলি আবার টাইপ করতে না চান তবে এটি কিছুটা কুৎসিত তবে সেডের সাথে করণীয়:

git clone git@github.com:pckujawa/pattern-rec.git && 
cd `echo $_ | sed -n -e 's/^.*\/\([^.]*\)\(.git\)*/\1/p'`

সম্পাদনা: আচ্ছা, আমি মানবকে ধন্যবাদ জানাতে যাচ্ছিলাম (নীচে মন্তব্য করুন)

git clone foo/bar && cd !$:t

তবে এটি zsh তে কাজ করে না ( zsh কীভাবে বিস্তৃতি ঘটায় তা প্রথম কমান্ডটিকে ইনপুট হিসাবে না বিবেচনা করে !$) এর কারণ। আমাকে কী করতে হবে তা দেখতে হবে !$:t( বাশ শেলের অগ্রযাত্রা | {{me: -w যাই হোক ।)। !$পূর্ববর্তী কমান্ডের শেষ অংশটি দখল করে এবং :t"লেজ রেখে সমস্ত নেতৃস্থানীয় ফাইল নাম উপাদানগুলি সরান।" ভাল তথ্য, তবে আমি আশা করি আমি এটি zsh এর সাথে কাজ করতে পারি (আমি noglobকোনও সাফল্য না দিয়ে চেষ্টা করেছি )।

সম্পাদনা: ব্যবহার করার পরিবর্তে sedবা !$:t(যা আমার জন্য zsh তে কাজ করে না) পরিবর্তে আমি আরও দুটি অপশন পেয়েছি (একটিটি https://unix.stackexchange.com/users/5685/frederik-deweerdt এর উত্তর https এর সাথে উত্তর দিয়ে গেছে) : //unix.stackexchange.com/users/129926/henrik-n এর মন্তব্য):

git clone git@github.com:npm/npm.git && cd $(basename $_ .git)

অথবা

git clone git@github.com:npm/npm.git && cd ${${_%%.git*}##*/}

git clone foo/bar && cd !$:t
মানব

যদি আপনার রেপো ইউআরএল শেষ হয় তবে .gitআপনি !$:t:rফোল্ডারের নামটি ব্যবহার করতে পারেন ।
মাইকেল স্ট্র্যামেল 30'18

2

যে কোনও POSIX শেলটির একটি সহজ সমাধান হ'ল স্পষ্টভাবে (যে কোনও ফাইল সিস্টেমের পাথ) ক্লোন করতে ডিরেক্টরিটি নির্দিষ্ট করা এবং এটি পুনরায় ব্যবহার করুন:

git clone <repository> <directory> &&
cd "$_"

এবং

cd -

কখন হবে তোমার.


2

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

clone_check() {
  (($? != 0)) && return
  local cmd=$history[$((HISTCMD-1))]
  cmd=("${(@Q)${(z)cmd}}")
  if [[ $cmd = "git clone "* ]]; then
    local dir
    if (($#cmd == 3)); then
      dir=${cmd[3]:t}
      dir=${dir%.git}
      dir=${dir#*:}
    elif (($#cmd > 3)); then
      dir=$cmd[-1]
    else
      return
    fi
    print -r CDing into $dir > /dev/tty
    cd -- $dir
  fi
}
precmd_functions+=(clone_check)

এটা বেশ সরল। এটা একটা ব্যাপার precmdহুক (প্রতিটি প্রম্পট আগে মৃত্যুদন্ড কার্যকর), যে চেক গত কমান্ড লাইন মতো লাগছিল কিনা git clone .../somethingবা git clone .../something dir, তা থেকে ডিরেক্টরি ও সিডি অনুমান।

যদি আপনার লেখা এটা কাজ করে না git clone foo; whateverবা whatever; git clone fooবা git clone --option repo...


+1 কোডটির জন্য আপনাকে অনেক ধন্যবাদ; আমি কয়েক দিন ধরে এটি ব্যবহার করছি। আমি কেবল একটি সমস্যা লক্ষ্য করেছি; যদি আপনি কোনও প্রকল্পের ক্লোনিং করার পরে টার্মিনালটি বন্ধ করে দেন, পরের বার আপনি টার্মিনালটি খোলেন, zsh দুটি ত্রুটি বার্তায় অভিযোগ করে: CDing into <project>এবং clone_check:cd:17: no such file or directory: <project>। টার্মিনালটি বন্ধ করার আগে আপনি যে শেষ কমান্ডটি চালিয়েছিলেন তার সাথে সাথে ত্রুটি অদৃশ্য হয়ে যায় $ git clone
ইউজার 938271

2

এখানে উপরের উত্তর একটি অভিযোজন OSX

  • mktemp অতিরিক্ত প্যারামিটার প্রয়োজন
  • git cloneলিখেছেন STDERRডিফল্টরূপে (দেখুন এই )

ফাংশন:

function git {
   local tmp=$(mktemp -t git)
   local repo_name

   if [ "$1" = clone ] ; then
     command git "$@" --progress 2>&1 | tee $tmp
     repo_name=$(awk -F\' '/Cloning into/ {print $2}' $tmp)
     rm $tmp
     printf "changing to directory %s\n" "$repo_name"
     cd "$repo_name"
   else
     command git "$@"
   fi
}

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

0

আমি এটি সুপারিশ করব না, তবে আপনি এই ওয়ান-লাইনার ব্যবহার করতে পারেন:

echo 'project' | xargs -I % sh -c 'git clone https://github.com/username/%.git && cd %'


0

এটি আপনার শেলের মধ্যে অন্তর্ভুক্ত করুন:

git(){
  case "$1" in clone) git-clone "${@:2}";; *) command git "$@";; esac
}
git-clone(){ 
   local tgt 
   tgt=$(command git clone "$@" 2> >(tee /dev/stderr |head -n1 | cut -d \' -f2)) ||
      return $?
   cd "$tgt"
}

এটি গিটারের স্ট্যান্ডার্ড ত্রুটি থেকে ক্লোনিং লক্ষ্যটি আত্মবিশ্বাসের সাথে সংগ্রহ করে এবং cd'(এবং কেবলমাত্র যদি) ক্লোনিংয়ের সাফল্য ছিল তবে লক্ষ্যটিতে প্রবেশ করে কাজ করে।

এটি নিয়মিত যে সমস্ত যুক্তি এবং বিকল্প গ্রহণ করে তা গ্রহণ git cloneকরে।

হয় আপনি গিট র‍্যাপারটি ব্যবহার করতে পারেন এবং আপনার সম্পূর্ণতা সম্পর্কে চিন্তা করার দরকার নেই, বা আপনি গিটের মোড়ক থেকে মুক্তি পেতে পারেন এবং আপনার git cloneসম্পূর্ণরূপে পুনর্বিবেচনা করতে পারেন git-clone

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