অবস্থানগত পরামিতি সহ গিট ওরফে


261

মূলত আমি ওরফে চেষ্টা করছি:

git files 9fa3

... আদেশটি কার্যকর করতে:

git diff --name-status 9fa3^ 9fa3

কিন্তু গিটটি ওরফে কমান্ডে অবস্থানগত পরামিতিগুলি প্রেরণ করে না। আমি চেষ্টা করেছি:

[alias]
    files = "!git diff --name-status $1^ $1"
    files = "!git diff --name-status {1}^ {1}"

... এবং কয়েক জন কিন্তু তারা কাজ করেনি।

অধ: পতনের মামলাটি হ'ল:

$ git echo_reverse_these_params a b c d e
e d c b a

... আমি এই কাজটি কীভাবে করব?


17
নোট করুন যে গিট ১.৮.২.১ এ শেল ফাংশন ছাড়াই এটি করা সম্ভব (আপনার মূল পদ্ধতির সাথে $1কাজ করা উচিত)।
আইমান্তাস

7
@ আইমন্টাস আপনি কি উত্তরের বিষয়ে বিস্তারিত বর্ণনা করবেন? এটি আমার পক্ষে কাজ করে না এবং আমি এটি সম্পর্কে কোনও দলিল খুঁজে পাচ্ছি না।
প্যাভন

@ আইমান্তাস রিলিজ নোটগুলিতে যদিও এ সম্পর্কে কিছুই নেই ।
নু

1
আমি নিশ্চিত করতে পারি যে আমি গিট ২.১১ এ কোনও শেনিনিগান ছাড়াই যুক্তি দিয়ে শেল কমান্ড চালাতে পারি।
অ্যারাক্যাট

উত্তর:


365

সর্বাধিক সুস্পষ্ট উপায় শেল ফাংশন ব্যবহার করা:

[alias]
    files = "!f() { git diff --name-status \"$1^\" \"$1\"; }; f"

একটি উপনাম ছাড়া !গিট কমান্ড হিসাবে গণ্য করা হয়; যেমন commit-all = commit -a

এর সাহায্যে !, এটি শেলটিতে এটির নিজস্ব কমান্ড হিসাবে চালিত হয়, আপনাকে আরও শক্তিশালী যাদু ব্যবহার করতে দেয়।

ইউপিডি
কারণ কমান্ডগুলির ${GIT_PREFIX}ফাইলের নাম উল্লেখ করার সময় কমান্ডগুলি সংগ্রহস্থলের গোড়ায় কার্যকর করা হয়


8
ধন্যবাদ, এটি ঠিক ঠিক দেখাচ্ছে: [ওরফে] ফাইলগুলি = "! F () {প্রতিধ্বনি $ 3 $ 2 $ 1;}; চ"; it গিট ফাইলগুলি abc => সিবিএ
user400575

1
@ কোহানিরিবার্ট: এটি আসলে শেল স্ক্রিপ্টের প্রশ্ন নয়; এটি গিট কনফিগারেশনের একটি বিশেষ কাজ। একটি উপনাম ছাড়া !গিট কমান্ড হিসাবে গণ্য করা হয়; যেমন commit-all = commit -a। এর সাহায্যে !, এটি শেলটিতে এটির নিজস্ব কমান্ড হিসাবে চালিত হয়, আপনাকে আরও শক্তিশালী যাদু ব্যবহার করতে দেয়।
ক্যাসকেবেল

40
সাবধানতা অবলম্বন করুন, !সংগ্রহশালার গোড়ায় দৌড়াবেন, সুতরাং আপনার উলামের নাম্বারে ফোন করার সময় আপেক্ষিক পথ ব্যবহার করা আপনার প্রত্যাশার ফলাফল দেয় না।
ড্রিলার

4
@ রবার্টডাইলি এটি ভেঙে না, এটি কেবল প্রয়োগ করে না। এটি কীভাবে যুক্ত করা যায় তার জন্য stackoverflow.com/questions/342969/… দেখুন ।
ক্যাসাবেল

3
দ্রষ্টব্য : এটি আর্গুমেন্টের উদ্ধৃতি দেয় না (যা সাধারণভাবে বিপজ্জনক)। এছাড়াও, একটি ফাংশন অপ্রয়োজনীয়। আরও ব্যাখ্যা জন্য আমার উত্তর দেখুন ।
টম হেল

96

আপনি shসরাসরি (কোনও ফাংশন তৈরির পরিবর্তে) উল্লেখ করতে পারেন :

[alias]
        files = !sh -c 'git diff --name-status $1^ $1' -

(লাইনের শেষে ড্যাশটি নোট করুন - আপনার এটির দরকার হবে))


8
আপনি যদি কমান্ডটি ভাগ করে নিচ্ছেন তবে আপনি সম্ভবত এটি ব্যবহার করতে চান sh, যেহেতু এটি নিজেই একটি শেল এবং এটি বেশিরভাগ সিস্টেমে উপলব্ধ। ডিফল্ট শেলটি কেবল তখনই কাজ করে যদি কমান্ডটি সমস্ত শেলের জন্য লিখিতভাবে কাজ করে।
নমোথেটিস

12
আমি পছন্দ --করতে -এটি কিছু সময়ে পরিচিত এবং ঘটনাক্রমে গড় stdin কম সম্ভবত হিসাবে। ("আর্গুমেন্ট - এর সমতুল্য -" বাশ-এ (1) অক্ষম)
বিএসবি


5
শেষ হওয়া '-' এর সঠিক অর্থ কী এবং এটি কোথায় নথিভুক্ত করা হয়েছে?
জিট্রাক্স

5
দ্রষ্টব্য : এটি আর্গুমেন্টের উদ্ধৃতি দেয় না (যা সাধারণভাবে বিপজ্জনক)। সাব-শেল (দিয়ে sh -c) তৈরি করাও অপ্রয়োজনীয়। একটি বিকল্প জন্য আমার উত্তর দেখুন ।
টম হেল

81

আপনি যে উপনামটি সন্ধান করছেন তা হ'ল:

files = "!git diff --name-status \"$1\"^ \"$1\" #"

যুক্তি বৈধতা সহ:

files = "!cd -- \"${GIT_PREFIX:-.}\" && [ x$# != x1 ] && echo commit-ish required >&2 || git diff --name-status \"$1\"^ \"$1\" #"

চূড়ান্ত# গুরুত্বপূর্ণ - এটা শেল (এটা মন্তব্য তাদের মধ্যে) দ্বারা প্রক্রিয়াকৃত হওয়া থেকে সমস্ত ব্যবহারকারী-সরবরাহকৃত আর্গুমেন্ট বাধা দেয়।

দ্রষ্টব্য: gitব্যবহারকারীর দ্বারা সরবরাহ করা সমস্ত আর্গুমেন্ট কমান্ড লাইনের শেষে রাখে। এটি কার্যকরভাবে দেখতে, চেষ্টা করুন:GIT_TRACE=2 git files a b c d

পালিয়ে যাওয়া (বাসা বাঁধার কারণে) উদ্ধৃতিগুলি ফাঁকা স্থান ফাইল ফাইলগুলির জন্য গুরুত্বপূর্ণ বা "; rm -rf --no-preserve-root /;)


সহজতম ক্ষেত্রে এটি সঠিক উত্তর, এটি কোনও ফাংশন বা sh -c এ মোড়ানো করে জটিল করার দরকার নেই।
এড র্যান্ডাল

4
হ্যাঁ, !ইতিমধ্যে বোঝানো হয়েছে sh -c(প্রিপেন্ডিংয়ের সময় দেখানো হয়েছে GIT_TRACE=2), সুতরাং অন্য একটি সাব-শেল চালানোর দরকার নেই। আরও জটিল ক্ষেত্রে আপনি কোন বিষয়গুলি দেখতে পাচ্ছেন?
টম হেল

আপনি কি ডিফল্ট আর্গুমেন্ট সেট করতে চান এটি কাজ করে? যেমন আমি এই কাজ করতে একটি গিটহাব জনসংযোগ আনতে চাই: fp = "! 1=${1:-$(git headBranch)}; 2=${2:-up}; git fetch -fu $2 pull/$1/head:$1; git checkout $1; git branch -u $2 #"। এটি প্রথম দুটি বিবৃতি ব্যতীত দুর্দান্ত কাজ করে তবে আপনি যদি সেগুলি ব্যবহার করেন তবে পড়ে যান। (আমারও আছে headBranch = symbolic-ref --short HEAD)
gib

2
এটি কাজ, এটি কাজ করে যদি আপনি নতুন প্যারাম সেট তাই এই জরিমানা: fp = "! a=${1:-$(git headBranch)}; b=${2:-up}; git fetch -fu $b pull/$a/head:$a; git checkout $a; git branch -u $b #"
gib

"উদ্ধৃতি কেন দরকার?
ইউজেন কনকভ

27

গিফট ম্যান পৃষ্ঠাতে বর্ণিত GIT_TRACE = 1 ব্যবহার করুন উলেস প্রক্রিয়াকরণটি স্বচ্ছ করতে:

$ git config alias.files
!git diff --name-status $1^ $1
$ GIT_TRACE=1 git files 1d49ec0
trace: exec: 'git-files' '1d49ec0'
trace: run_command: 'git-files' '1d49ec0'
trace: run_command: 'git diff --name-status $1^ $1' '1d49ec0'
trace: exec: '/bin/sh' '-c' 'git diff --name-status $1^ $1 "$@"' 'git diff --name-status $1^ $1' '1d49ec0'
trace: built-in: git 'diff' '--name-status' '1d49ec0^' '1d49ec0' '1d49ec0'
trace: run_command: 'less -R'
trace: exec: '/bin/sh' '-c' 'less -R' 'less -R'
MM      TODO

আপনার আসল কমান্ডগুলি গিট সংস্করণ ১.৮.৩.৪ নিয়ে কাজ করে (ইমান্টাস এটি পরিবর্তন করেছেন 1.8.2.1 এ)

sh -c '..' --এবং f() {..}; fঅপশন উভয় পরিচ্ছন্নভাবে হ্যান্ডেল "$ @" বিভিন্ন উপায়ে মাপদণ্ডগুলি (GIT_TRACE সঙ্গে দেখুন)। একটি উপনামে "#" যুক্ত করাও অনুসরণযোগ্যগুলি না রেখে অবস্থানগত পরামিতিগুলিকে মঞ্জুরি দেয়।


1
ব্যাখ্যার জন্য ধন্যবাদ: এই কমান্ডগুলি আপনার পরামর্শ অনুসরণ করে মূল সমস্যাটি সম্পর্কে আমার জন্য কাজ করে:files = "!git diff --name-status $1^ $1 #" files = "!git diff --name-status $1^"
ব্যবহারকারী 229191758

20

যেমন উপরে ড্রেলমার বলেছেন :

" সতর্ক হোন, ! সংগ্রহস্থলের গোড়ায় চলবে, সুতরাং আপনার উপনাম কল করার সময় আপেক্ষিক পাথ ব্যবহার করা আপনার প্রত্যাশার ফলাফল দেয় না। - ড্রিলার আগস্ট 8 '13 এ 16:28 »

GIT_PREFIX আপনি যে উপ-ডিরেক্টরিতে রয়েছেন সেখানে গিট দ্বারা সেট করা হচ্ছে, আপনি প্রথমে ডিরেক্টরিটি পরিবর্তন করে এটিকে রোধ করতে পারেন:

গিট কনফিগারেশন - গ্লোবাল ওরফে.লস '! সিডি "$ {GIT_PREFIX: -।}"; ls -al '


আমি এটির সাথেও সমস্যায় পড়ছি (সংগ্রহস্থলের মূলে কমান্ডগুলি চালানো হচ্ছে) তবে এই সমাধানটি কিছু করতে পারে বলে মনে হচ্ছে না। (যদি এটি গুরুত্বপূর্ণ হয় তবে আমি ওএস এক্স ব্যবহার করছি)
ওয়ালডিরিয়াস

ওহো ... গিট ওরফে হ'ল আমি তৈরি একটি উপন্যাস।
পিয়েরে-অলিভিয়ের ভারেস

(git 1.8.2 যেহেতু) গিট কনফিগারেশন - সেট ওরফে.লিয়াস = '! গিট কনফিগার - গ্লোবাল ওরফে $ 1 "ier 2" '
পিয়েরে-অলিভিয়ের ভ্যারেস

"আপনার Git alias লেখা (যে run শেল কমান্ড এবং অধিকার PWD প্রয়োজন) প্রেফিক্স সহ এই আমার জন্য কাজ শেষ পর্যন্ত হয় cd ${GIT_PREFIX:-.} &&.": (উৎস stackoverflow.com/a/21929373/266309 )
waldyrious

এই উদ্ধৃতি না। !cd "${GIT_PREFIX:-.}" && ls -al
মীরাবিলোস

8

আমি এটি করতে পারি এমন একটি ওরফে দিয়ে এটি করতে চেয়েছি:

git checkout $1;
git merge --ff-only $2;
git branch -d $2;

শেষ পর্যন্ত, আমি গিট-এম নামের একটি শেল স্ক্রিপ্ট তৈরি করেছি যাতে এই সামগ্রীটি রয়েছে:

#!/bin/bash -x
set -e

#by naming this git-m and putting it in your PATH, git will be able to run it when you type "git m ..."

if [ "$#" -ne 2 ]
then
  echo "Wrong number of arguments. Should be 2, was $#";
  exit 1;
fi

git checkout $1;
git merge --ff-only $2;
git branch -d $2;

এই সুবিধা এটাই হয়েছে অনেক কারণ এটি একাধিক লাইনে আরো সহজপাঠ্য। প্লাস আমি বাশ দিয়ে -xএবং সাথে কল করতে সক্ষম হতে চাই set -e। আপনি সম্ভবত পুরো নামটি একটি উপাধি হিসাবে করতে পারেন তবে এটি অত্যন্ত কুশ্রী এবং এটি বজায় রাখা কঠিন হবে।

ফাইলটির নামকরণ করা হওয়ায় git-mআপনি এটিকে এভাবে চালাতে পারেন:git m foo bar


1
আমি এটি আরও অনেক পছন্দ করি তবে এই পদ্ধতির সাহায্যে আমি কীভাবে স্বতঃসমাপ্তি ব্যবহার করতে পারি তা অনুধাবন করতে পারিনি। '!f() { : git branch ; ... }; f'উপাধিতে আপনি এটি করতে পারেন: এবং এটি উপনামটি একটি শাখা হিসাবে স্বয়ংক্রিয়ভাবে পূর্ণ করবে যা অতি কার্যকর।
হাসেক

হ্যাঁ, আমি মনে করি যে আমি পথে পৃথক স্ক্রিপ্ট ফাইল হিসাবে অ-তুচ্ছ জিনিসগুলি করা পছন্দ করি। নীচের দিকটি হ্যাঁ, আপনি রেফারেন্সের মতো জিনিসগুলির স্বয়ংক্রিয় সমাপ্তি আলগা করেন। আপনি নিজের স্বয়ংক্রিয় সমাপ্তিটি ম্যানুয়ালি কনফিগার করে এটিকে ঠিক করতে পারেন। আবার যদিও, আমি পছন্দ করি যে আপনি কেবল পথের একটি ফোল্ডারে কোনও স্ক্রিপ্ট ফেলে দিতে পারেন এবং এটি কাজ শুরু করবে, তবে স্বয়ংক্রিয়ভাবে সমাপ্তির জন্য আপনাকে এটি 'লোড' করতে হবে, তাই সাধারণত এটি .bashrcআমার উত্স হিসাবে আমার ফাইলটিতে থাকে। তবে আমি মনে করি না যে আমি কীভাবে কোনও স্ক্রিপ্টে আর্গুমেন্টকে স্বয়ংক্রিয়ভাবে সম্পূর্ণ করি যতটা স্ক্রিপ্ট নিজেই পূর্ণ করে ফেলেছি এবং এটি কেবল দেবের সময়ই হবে।
thecoshman

4

সবেমাত্র তেমন কিছুতে umpুকে পড়ে; আশা করি এটি আমার নোট পোস্ট করার জন্য ওকে। একটি জিনিস যা আমাকে gitযুক্তিগুলির সাথে git help configএলিয়াসগুলি সম্পর্কে বিভ্রান্ত করে , সম্ভবত এটি থেকে আসে (আমার গিট সংস্করণটি 1.7.9.5):

যদি উলামের সম্প্রসারণটি বিস্মৃতকরনের সাথে উপসর্গ করা হয় তবে এটি শেল কমান্ড হিসাবে বিবেচিত হবে। উদাহরণস্বরূপ, "ওরফে.নেউ =! গিটক - সমস্ত - নট ওআরআইজিএইইডিইডি" সংজ্ঞায়িত করা, "গিট নিউ" শেল কমান্ড "গিটক - সমস্ত - নট ওআরআইজিএইইডিইডি" চালানোর সমতুল্য। নোট করুন যে শেল কমান্ডগুলি কোনও সংগ্রহস্থলের শীর্ষ-স্তরের ডিরেক্টরি থেকে কার্যকর করা হবে যা সম্ভবত বর্তমান ডিরেক্টরি হতে পারে না। [...]

আমি এটি যেভাবে দেখছি - উদ্দীপনা পয়েন্টের সাথে উপসর্গ করার সময় যদি কোনও উপকরণ "শেল কমান্ড হিসাবে বিবেচিত হবে" - তবে আমাকে কোনও ক্রিয়াকলাপ বা sh -cযুক্তি সহ কেন ব্যবহার করতে হবে ; কেন শুধু আমার আদেশ যেমন লিখছেন না?

আমি এখনও উত্তরটি জানি না - তবে আমি মনে করি বাস্তবে ফলাফলের মধ্যে কিছুটা পার্থক্য রয়েছে। এখানে একটি ছোট পরীক্ষা - এটি আপনার .git/configবা আপনার মধ্যে ফেলে দিন ~/.gitconfig:

[alias]
  # ...
  ech = "! echo rem: "
  shech = "! sh -c 'echo rem:' "
  fech = "! f() { echo rem: ; }; f " # must have ; after echo!
  echargs = "! echo 0[[\"$0\"]] 1-\"$1\"/ A-"$@"/ "
  fechargs = "! f() { echo 0[[\"$0\"]] 1-\"$1\"/ A-"$@"/ ; }; f "

আমি এই এলিয়াসগুলি চালিয়ে যাচ্ছি তা এখানে:

$ git ech word1 word2
rem: word1 word2

$ git shech word1 word2
rem:

$ git fech word1 word2
rem:

$ git echargs word1 word2
0[[ echo 0[["$0"]] 1-"$1"/ A-$@/ ]] 1-word1/ A-word1 word2/ word1 word2

$ git fechargs word1 word2
0[[ f() { echo 0[["$0"]] 1-"$1"/ A-$@/ ; }; f ]] 1-word1/ A-word1 word2/

... বা: যখন আপনি একটি উপনামে " !যেমন রয়েছে" এর পরে "প্লেইন" কমান্ডটি ব্যবহার করছেন git- তখন gitস্বয়ংক্রিয়ভাবে সেই আদেশটিতে যুক্তি তালিকাটি সংযোজন করা হয়! এটি এড়ানোর একটি উপায় হ'ল আপনার স্ক্রিপ্টটিকে ফাংশন হিসাবে বলা - বা যুক্তি হিসাবে sh -c

এখানে (আমার জন্য) আরও একটি আকর্ষণীয় বিষয় হ'ল শেল স্ক্রিপ্টে, কেউ সাধারণত স্বয়ংক্রিয় ভেরিয়েবলটি $0স্ক্রিপ্টের ফাইলের নাম হিসাবে প্রত্যাশা করে । তবে একটি gitউপন্যাস ফাংশনের জন্য $0আর্গুমেন্টটি মূলত পুরো স্ট্রিংয়ের বিষয়বস্তু command কমান্ডটি নির্দিষ্ট করে (কনফিগ ফাইলে প্রবেশ করানো হয়েছে)।

এই কারণেই, আমার ধারণা, আপনি যদি ভুল জিজ্ঞাসা করে থাকেন - নীচের ক্ষেত্রে এটি বাইরের ডাবল উদ্ধৃতিগুলি থেকে বেরিয়ে আসবে:

[alias]
  # ...
  fail = ! \"echo 'A' 'B'\"

... - তাহলে git(আমার পক্ষে, কমপক্ষে) কিছুটা গুপ্ত বার্তা দিয়ে ব্যর্থ হবে:

$ git fail
 "echo 'A' 'B'": 1: echo 'A' 'B': not found
fatal: While expanding alias 'fail': ' "echo 'A' 'B'"': No such file or directory

আমি মনে করি, যেহেতু gitপুরো স্ট্রিংটি কেবল একটি যুক্তি হিসাবে "দেখেছি" !- এটি এটিকে এক্সিকিউটেবল ফাইল হিসাবে চালানোর চেষ্টা করেছিল; এবং অনুরূপভাবে এটি "echo 'A' 'B'"ফাইল হিসাবে খুঁজে পেতে ব্যর্থ হয়েছিল ।

যাই হোক না কেন, git help configউপরের উদ্ধৃতিটির প্রসঙ্গে , আমি অনুমান করতে পারি যে এটির মতো এমন কিছু বলা আরও সঠিক: " ..." অনুরোধ "গিট নিউ" শেল কমান্ড চালানোর সমতুল্য "গিট - সমস্ত - নন ওরিগহাইড $ @ ", যেখানে $ @ রানটাইমে কমান্ড লাইন থেকে গিট কমান্ড ওরফে প্রেরণ করা আর্গুমেন্ট ... ... "। আমি মনে করি এটিও ব্যাখ্যা করবে, কেন ওপিতে "সরাসরি" পদ্ধতির অবস্থানগত পরামিতিগুলির সাথে কাজ করে না।


সুন্দর পরীক্ষা। সমস্ত সম্ভাবনা যাচাই করার একটি দ্রুত উপায়!
আলবফান

fail"প্রতিধ্বনি 'এ' বি" (অর্থাত্ 10 অক্ষর দীর্ঘ) নামক একটি কমান্ড চালানোর চেষ্টা করছে। একই ত্রুটি sh -c "'echo a b'"এবং একই কারণে, উদ্ধৃতিগুলির অনেকগুলি স্তর
বিএসবি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.