গিট এলিয়াস - একাধিক কমান্ড এবং পরামিতি


181

আমি এমন একটি উপাধি তৈরি করার চেষ্টা করছি যা একাধিক গিট কমান্ড এবং অবস্থানগত পরামিতি উভয়ই ব্যবহার করে। প্রত্যেকটির জন্য স্ট্যাকওভারফ্লো পৃষ্ঠা রয়েছে এবং এটি উভয়কেই করা বেদনাদায়কভাবে স্পষ্ট হবে তবে আমার সমস্যা হচ্ছে।

উদাহরণ হিসাবে, আমি শাখা ফুতে স্যুইচ করতে চাই এবং একটি স্থিতি সম্পাদন করতে চাই। সুতরাং আমার মধ্যে .gitconfig:

  [alias] 
     chs = !sh -c 'git checkout $0 && git status'

যা কাজ করে না যদিও এর মতো কিছু কাজ করবে।

chs = !sh -c 'git checkout $0'

echoes = !sh -c 'echo hi && echo bye'

যে কোনও অন্তর্দৃষ্টি প্রশংসা করা হবে।


আমার উপনাম: গিট কনফিগারেশন - গ্লোবাল ওরফে.গো '! গিট কমিট-এ & অ্যান্ড গিট টান --rebase && গিট পুশ অ্যান্ড গিট স্ট্যাটাস'। দ্রষ্টব্য: সাধারণ উদ্ধৃতি ব্যবহার করুন।
মার্কাস বেকার

উত্তর:


156

এটি কাজ করবে (zsh এবং বাশ দিয়ে পরীক্ষিত):

[alias] chs = !git checkout $1 && git status

1
না এটা হবে না। গিট রূপান্তরিত git chs fooহবেgit checkout && git status foo
লিলি ব্যালার্ড

24
আকর্ষণীয়, গিটটি এখন শেল অ্যালিয়াসে অবস্থানগত ভেরিয়েবলগুলি পূরণ করে। তবে এটি এখনও ভেঙে গেছে, কারণ এটি তাদেরকে তর্ক হিসাবে দেখায়। echo $1 && echo done"Foo" আর্গুমেন্টের সাহায্যে একটি উপনাম , "foo" এবং "সম্পন্ন foo" উভয়ই আউটপুট দেয়।
লিলি বালার্ড

7
প্রথম অনুরোধের জন্য পূর্ববর্তী বিস্ময়কর বিন্দুটি কী git?
এলিজা লিন

21
@ এলিজাহলিন: একটি গিট ওরফে, একটি শীর্ষস্থানীয় !মানে পুরো জিনিসটি শেলের কাছে পৌঁছে দেয়। অন্যথায়, এটি ধরে নিয়েছে আপনি অন্য গিট কমান্ড চালানোর চেষ্টা করছেন এবং এটি gitবাইনারি হিসাবে আর্গুমেন্ট হিসাবে পাস করেন ।
লিলি

2
পছন্দ করুন আমি ;:পরিবর্তে সুপারিশ করব && :। এবং এটি ইউনিক্সে ঠিক কাজ করে।
লিলি বালার্ড

80

এটি উইন্ডোজ ব্যাচ / এমএসএসজিট ব্যাশকে লক্ষ্য করে; অন্যান্য পরিবেশে কাজ নাও করতে পারে।

যেমনটি অলিভিয়ার ভারদিয়ার এবং লিলি ব্যালার্ড জানিয়েছেন

[alias] chs = !git checkout $1 && git status

প্রায় কাজ করে, তবে যুক্তিটির উত্সাহযুক্ত অতিরিক্ত সন্নিবেশ দেয় ...

git chs demo -> git checkout demo && git status demo

তবে আপনি যদি && :নিজের উরফের শেষে যোগ করেন তবে উত্সাহিত যুক্তিটি কোনও লোকেশন ট্যাগে গ্রাস করা হবে।

সুতরাং

[alias] chs = !git checkout $1 && git status && :

সঠিক আউটপুট দেয় ... git chs demo -> git checkout demo && git status


9
এটি && :হ'ল সোনার এবং এই সমাধানটি কমান্ডগুলির জন্য কাজ করে যেখানে অতিরিক্ত যুক্তি সমস্যাযুক্ত হবে।
ক্লে

2
@ ক্লে (বা অন্য যে কেউ) - কেউ কি বেস-চ্যালেঞ্জকে ব্যাখ্যা করতে পারে যা && :করে?
জাস্টিন মরগান

6
@ জাস্টিনমরগান অ্যান্ড অ্যান্ড মানে হল পূর্ববর্তী কমান্ডটি যদি 0 (সাফল্য) হয়ে থাকে তবে && এর পরে কমান্ডটি চালান। ':', কোলন, একটি শেল বিল্টিন কমান্ড, যা যুক্তি প্রসারিত এবং পুনর্নির্দেশগুলি সম্পাদন এবং স্ট্যাটাসটি ফিরিয়ে দেওয়ার বাইরে কিছু করে না Here এখানে কিছু ব্যবহার রয়েছে: ১. a=123;$aত্রুটি, কিন্তু a=123; : $aতা করে না। 2. : > hello.txtহ্যালো.টেক্সট খালি। ৩. if [ "$a" = "hello" ];then : ;fiঠিক আছে তবে ':' ছাড়াই ত্রুটি চলে। এটি passঅজগর মত । ৪. : this is a comment, স্থান অনুসরণকারী কোলন #একটি মন্তব্য লাইনের মতো কাজ করে ।
এলপিকেএ

2
এই যেমন একটি হ্যাক ... গিট একাধিক কমান্ড মোড গ্রহণ করা উচিত
kchoi

1
ব্যাখ্যার জন্য @ এলপিকেকে ধন্যবাদ। এক প্রজেক্টের জন্য আমার স্থানীয় গিট ওরফে ছিল co = !git checkout public/compiled && git checkout $1এবং যখন আমি git co masterবার্তাটি পেতাম error: pathspec 'master' did not match any file(s) known to git.। আমি মনে করি না যে এই উত্তরটি আমার পক্ষে কার্যকর হবে কারণ এটির মধ্যে প্রথমটি উল্লেখ করা হয়েছে উইন্ডোজ এবং আমি লিনাক্সে আছি। তবে আপনি কেন তা ব্যাখ্যা করেছেন।
টাইলার কলিয়ার

72

আপনি একটি শেল ফাংশন সংজ্ঞায়িত করতে পারেন।

[alias] chs = "!f(){ git checkout \"$1\" && git status; };f"

আমি এটি অন্য স্ট্যাকওভারফ্লো পৃষ্ঠায় দেখেছি, তবে আমার সাইগউইন টার্মিনাল বলে যে আমি যখন এটি চালানোর চেষ্টা করি তখন ফাংশনটি স্বীকৃত হয় না।
স্টেলা

@ স্টেলা: আমি সেখানে একটি সমাপনী উদ্ধৃতি রেখেছি যা এই কনফিগার ফাইল সিনট্যাক্সটি কার্যকর নয়। আপনার এটি ছিল না তা নিশ্চিত করুন।
লিলি বালার্ড

1
বাহ ... দুর্ভাগ্যক্রমে, এটি সমস্ত সংস্করণের সমস্যা ছিল। আমি গিট ১.7.৩ ব্যবহার করছিলাম এবং এই পদ্ধতির কোনওটিই কাজ করে নি। আমি 1.7.6 এবং voila আপডেট করেছি, সবকিছু কাজ করেছে। ধন্যবাদ বন্ধুরা!
স্টেলা

4
উইন্ডোজ ব্যবহার করে যদি আমি মনে করি যে আপনাকে শেল ফাংশন সংজ্ঞাটি ডাবল-কোট দিয়ে ঘিরে ফেলতে হবে"
drzaus

4
অলিভিয়ের উত্তর আমার জন্য পরামিতি (ওএসএক্স) ব্যবহার করে না for এটি পুরোপুরি কাজ করে।
ওহাদ স্নাইডার

25

আমি বহু-লাইন এবং বেশ জটিল গিট এলিয়াস তৈরি করতে সক্ষম হয়েছি। তারা উইন্ডোজটিতে দুর্দান্ত কাজ করে তবে আমি ধরে নিই যে তারা অন্য কোথাওও কাজ করবে, উদাহরণস্বরূপ:

safereset = "!f() { \
                trap 'echo ERROR: Operation failed; return' ERR; \
                echo Making sure there are no changes...; \
                last_status=$(git status --porcelain);\
                if [[ $last_status != \"\" ]]; then\
                    echo There are dirty files:;\
                    echo \"$last_status\";\
                    echo;\
                    echo -n \"Enter Y if you would like to DISCARD these changes or W to commit them as WIP: \";\
                    read dirty_operation;\
                    if [ \"$dirty_operation\" == \"Y\" ]; then \
                        echo Resetting...;\
                        git reset --hard;\
                    elif [ \"$dirty_operation\" == \"W\" ]; then\
                        echo Comitting WIP...;\
                        git commit -a --message='WIP' > /dev/null && echo WIP Comitted;\
                    else\
                        echo Operation cancelled;\
                        exit 1;\
                    fi;\
                fi;\
            }; \
            f"

আমি একটি পোস্ট লিখেছি এবং আরও কয়েকটি উদাহরণ এখানে আছে


2
এর মধ্যে একটি উন্নতি হ'ল রিথ !f() { : resetকমান্ড github.com/git/git/blob/master/contrib/completion/…
একজন ব্যবহারকারী 19

দারূন কাজ! নিবন্ধটি কোন লাইসেন্সের অধীনে প্রকাশিত হয়? আমি যদি রাশিয়ান স্ট্যাকওভারফ্লোতে এর কিছু অংশ অনুবাদ করি তবে আপত্তি করবেন কি?
নিক ভলিনকিন

@ নিকভোলিনকিন দেরীতে উত্তর সম্পর্কে দুঃখিত। আপনাকে ধন্যবাদ এবং অবশ্যই এগিয়ে যান :)
VitalyB

22
[alias]
chs = !git branch && git status

7
কিসের !জন্য?
স্বায়ত্তশাসিত

আমি এর জন্য ডকটি খুঁজে পাইনি !তবে যতক্ষণ না আমি ডিফল্টরূপে গিটটি দেখতে পাচ্ছি তা ধরে নেবে যে উপনামটি গিট কমান্ড তাই t = statusকাজ করবে। তবে আপনি চেষ্টা t = git statusকরলে এটি কাজ করবে না (বলবে "গিট" কমান্ডটি পাওয়া যায়নি)। যাতে যেখানে !আসে সেখানে এটি কমান্ডটি চালনার জন্য বলে যে এটি শেল ছিল এবং সাধারণত যখন আপনার প্রতি একাধিক গিট কমান্ড থাকে তখন আপনার প্রয়োজন হয়, t = !git status && git logউদাহরণস্বরূপ আপনার এটি থাকতে পারে এবং এটি কাজ করবে।
লরেন্ট

6

আর একবার চেষ্টা কর:

[alias]
    chs = "!sh -c 'git checkout \"$0\" && git status'"

এটিকে কল করুন: git chs master


6

\প্রতিটি লাইনের শেষে সংযোজন করে মাল্টলাইন গিট ওরফে রাখা সম্ভব ।

[alias] 
   chs = "!git checkout $1 \ 
          ; git status     \
         "

2
ধন্যবাদ! "!git fetch --prune --all; git pull --rebase upstream master; git push origin master"আমার ওরফে ব্যবহার করতে আসলে আমার কোনও সমস্যা হয়নি ।
ড্রুগানস

3

এখানে সমস্যাটি হ'ল অবস্থানগত পরামিতিগুলি শেল কমান্ডে দুবার (গিট ১.৯.২ অনুযায়ী) প্রেরণ করা হবে বলে মনে হচ্ছে। আমি কী বলতে চাইছি তা দেখতে, এটি ব্যবহার করে দেখুন:

[alias]
  test = !git echo $*

তারপর, না git test this is my testing string। আপনি নিম্নলিখিত আউটপুট পর্যবেক্ষণ করা উচিত (স্বচ্ছতার জন্য এখানে শেষ দুটি লাইন সম্পাদিত):

03:41:24 (release) ~/Projects/iOS$ git test this is my testing string
this is my testing string this is my testing string
^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^
          #1                         #2

এটিকে ঘিরে কাজ করার একটি উপায় হ'ল

[alias]
  chs = !git checkout $1 && git status && git echo x >/dev/null

এটি অতিরিক্ত অবস্থানগত পরামিতি গ্রহণ করবে কারণ এটি শেষ প্রতিধ্বনি কমান্ডের সাথে প্রয়োগ হয়ে যায় এবং ফলাফলগুলিতে কোনও প্রভাব ফেলবে না।

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