-উ ছাড়া স্বয়ংক্রিয়ভাবে আপস্ট্রিম সেট করতে গিট পুশ কনফিগার করবেন কীভাবে?


105

আমি git push originপ্রথমবারের মতো স্থানীয়ভাবে তৈরি একটি শাখাটি চাপলে আমি স্বয়ংক্রিয়ভাবে প্রবাহের রেফারেন্স সেট করতে চাই ।

আমি জানি git push -u, তবে আমি -uআগে ব্যবহার করেছি বা অন্যথায় একটি প্রবাহের রেফারেন্স সেট করেছি কিনা তা নিয়ে আমি ভাবতে চাই না । অন্য কথায়, আমি git pushস্বয়ংক্রিয়ভাবে git push -uকোনও শাখার এমন কোনও ধাক্কায় প্রভাব ফেলতে চাই যা ইতিমধ্যে প্রবাহিত নয়।

এটা কি সম্ভব? যদি এটির কোনও উপাধি বা ইউটিলিটি স্ক্রিপ্ট প্রয়োজন হয় তবে তা ঠিক।


4
Git-config (1) এ বিকল্পগুলি push.defaultএবং branch.<name>.mergeবিকল্পগুলি ব্যবহার করা সম্ভব কিনা তা আপনি পরীক্ষা করেছেন ?

4
আমি push.defaultসেট করে রেখেছি current- এইভাবে আমি কেবল git push originকোনও রেসপেস্ক বা উজানের প্রবাহ ছাড়াই বলতে পারি । তবে এটি স্বয়ংক্রিয়ভাবে প্রবাহটি সেট করতে সহায়তা করে না।
জন

উত্তর:


66

আপনি এটি git configব্যবহার করে কনফিগার করতে পারেন git config --global push.default current

দস্তাবেজ: https://git-scm.com/docs/git-config/# ডকুমেন্টেশন/ git- config.txt- pushdefault


9
আমার সে সেট আছে - আমি কেবল git push originকোনও রেসপেস্ক বা উজানের প্রবাহ ছাড়াই বলতে পারি । তবে এটি স্বয়ংক্রিয়ভাবে প্রবাহটি সেট করতে সহায়তা করে না।
জন

আমার জন্য কাজ করে: +1:
টিম স্ট্রিজডহর্স্ট

4
হ্যাঁ, জন জন যেমন বলেছেন, এটি মনে রাখা গুরুত্বপূর্ণ যে এটি স্থানীয় শাখাটি দূরবর্তী স্থানটিকে ট্র্যাক করে না ; এটি কেবল স্থানীয় হিসাবে একই নামে দূরবর্তী শাখা তৈরি করে।
ওয়াল্ডরিয়াস

আপনার যদি প্রয়োজন হয় তবে যথেষ্ট ভাল push, যেমন তার শাখায় কেবলমাত্র একজন বিকাশকারী রয়েছেন, যিনি কেবলমাত্র একটি রেপোর একটি অনুলিপি সম্পাদনা করেন।
superarts.org

29

যেহেতু আমি গিট কনফিগারেশন ব্যবহার করে এটি সম্ভব বলে মনে করি না, তাই আপনি ব্যাশে যা করতে পারেন তা এখানে:

[[ $(git config "branch.$(git rev-parse --abbrev-ref HEAD).merge") = '' ]] && git push -u || git push

যদি বর্তমান শাখায় দূরবর্তী ট্র্যাকিং শাখা থাকে তবে এটি কল করে git pushঅন্যথায় এটি কল করে git push -u


24
আপনি এখন করতে পারেন git config --global push.default current
Andrea Bergonzo

4
@ আন্ড্রেয়া বার্গনজো এই আমার কাছে একমাত্র ভাল উত্তর, আপনি কি উত্তর হিসাবে যুক্ত করতে পারেন?
পিডিএম

8
@ আন্ড্রেয়া বার্গনজো, @ পিডিএম - নোট করুন যে push.default=currentকেবলমাত্র স্থানীয় শাখা হিসাবে একই নামে দূরবর্তী সংগ্রহস্থলে একটি শাখা তৈরি করে, তবে দূরবর্তীটি ট্র্যাক করার জন্য স্থানীয় শাখা সেট করে না । আমি কেন নিশ্চিত তা জানি না, তবে এটি মনে রাখা উচিত।
ওয়াল্ডরিয়াস

23

দ্রষ্টব্য: নতুন ডিফল্ট পুশ নীতিটি " simple" প্রবাহের শাখার উপর নির্ভর করে "এর অর্থ হল:
একটি প্রবাহ শাখা নির্ধারণ কোনও স্বেচ্ছাসেবী পদক্ষেপ হিসাবে দেখা হয়, কোনও লুকানো স্বয়ংক্রিয়ভাবে নয়

" git push [$there]" কী ধাক্কা দেবে না বললে, আমরা এখন পর্যন্ত theতিহ্যবাহী "ম্যাচিং" শব্দার্থবিজ্ঞান ব্যবহার করেছি (আপনার সমস্ত শাখা যেমন রিমোটে প্রেরণ করা হয়েছিল যতক্ষণ না সেখানে ইতিমধ্যে একই নামের শাখা রয়েছে)।

আমরা " simple" শব্দার্থকগুলি ব্যবহার করব যা বর্তমান শাখাকে একই নামের সাথে শাখায় ঠেলে দেয় কেবল তখনই যখন বর্তমান শাখাটি দূরবর্তী শাখার সাথে সংহত করার জন্য সেট করা হয়
এটি পরিবর্তন করতে একটি ব্যবহারকারী পছন্দ কনফিগারেশন ভেরিয়েবল " push.default" রয়েছে।


সুতরাং মেকানিকাল ফিশের উত্তর থেকে উত্সাহিত করতে, আপনি ডান ডাবল উদ্ধৃতি ( ") পলায়ন ( \") দ্বারা একটি উপনাম সংজ্ঞায়িত করতে পারেন :

git config alias.pu "![[ $(git config \"branch.$(git rev-parse --abbrev-ref HEAD).merge\") = '' ]] && git push -u || git push"

git pu origin

স্কেটিটিডি নীচের মন্তব্যে প্রস্তাব করেছেন :

alias gpu='[[ -z $(git config "branch.$(git symbolic-ref --short HEAD).merge") ]] && git push -u origin $(git symbolic-ref --short HEAD) || git push'

একাধিক লাইনে:

alias gpu='[[ -z $(git config "branch.$(git symbolic-ref --short HEAD).merge") ]] && 
           git push -u origin $(git symbolic-ref --short HEAD) || 
           git push'

4
কীভাবে উপনামটি সেট আপ করবেন তা দেখানোর জন্য ধন্যবাদ। যদিও আপনার উত্তরটির প্রথম অংশের সংযোগ বা প্রাসঙ্গিকতার বিষয়ে আমি পরিষ্কার নই।
জন

4
@ জন আমার বক্তব্যটি হ'ল: আপনি এমন একটি পদক্ষেপ অবরুদ্ধ করবেন যা একটি উদ্দেশ্যমূলক বলে মনে করা হয়। আপনি যে উপনামটি সেটআপ করতে পারেন তবে আমি অন্যান্য পাঠকদের কাছে পরিষ্কার করতে চেয়েছিলাম কেন এই স্পষ্ট -uবিকল্পটি বিদ্যমান, এবং কেন বিকল্পটি স্বয়ংক্রিয়ভাবে তৈরি করার জন্য কোনও কনফিগার নেই (তাই উপনাম)।
ভনসি

4
আমার .zshrc এ zsh এলিয়াসগুলির একটি তালিকা রয়েছে। আমি নিম্নলিখিত জেডশিয়ার ওরফে তৈরি করতে এই উত্তরটি সংশোধন করেছি:alias gpu='[[ -z $(git config "branch.$(git symbolic-ref --short HEAD).merge") ]] && git push -u origin $(git symbolic-ref --short HEAD) || git push'
Sc0ত্তিD

4
@ Sc0ত্তিD আকর্ষণীয়, আপনাকে ধন্যবাদ। আরও দৃশ্যমানতার জন্য আমি আপনার মন্তব্যে উত্তরে অন্তর্ভুক্ত করেছি।
ভোনসি

20

আমারও একই সমস্যা ছিল আমি এই উপনামটি খুঁজে পেয়েছি (.gitconfig)

[alias] track = "!git branch --set-upstream-to=origin/`git symbolic-ref --short HEAD`"

ব্যবহার: git trackনতুন শাখায় একবার (বর্তমানে চেক আউট)। তারপরে ঠিক স্বাভাবিক হিসাবে চাপ দিন :)


15

@ ভনসি এবং @ ফ্রেক্সুজের উত্তরগুলি সহায়ক, তবে তাদের উভয় সমাধানই আমার জন্য ত্রুটি তৈরি করে। তাদের উভয় উত্তর ব্যবহার করে, আমি এমন কিছু সংঘবদ্ধ করেছি যা আমার পক্ষে কাজ করে:

    [alias]
    pu = ![[ $(git config "branch.$(git symbolic-ref --short HEAD).merge") = '' ]] && git push -u origin $(git symbolic-ref --short HEAD) || git push

পারেন নির্বাহ এই ফলাফল git push -u origin $BRANCHNAMEবা git pushকিনা তার মূল প্রজেক্টের (সম্পত্তি উপর নির্ভর করে branch.$BRANCHNAME.merge) সংজ্ঞায়িত করা হয়।

কমান্ড লাইনে এই উপন্যাসটি প্রবেশের জন্য এস্কেপ কোডগুলির প্রয়োজন হবে, তাই সঠিক ফাইল ( $HOME/.gitconfig(গ্লোবাল), .git/config(স্থানীয়), বা /etc/gitconfig(সিস্টেম) intoোকানোর জন্য সম্পাদক ব্যবহার করা সম্ভবত সবচেয়ে সহজ iest


4
এটি সবচেয়ে সোজা এবং সম্পূর্ণ উত্তর complete ফাইলটির জন্য শিকার না করেই ডিফল্ট সম্পাদকটি খোলার জন্য আপনি করতে পারেনgit config --global -e
অ্যাডাম টলি

5

আমি এই সাধারণ বাশ স্ক্রিপ্টটি ব্যবহার করে এই সমস্যাটি সমাধান করেছি। এটি বিদ্যমান শাখাগুলিতে কাজ করবে না, তবে আপনি যদি এই ফাংশনটি দিয়ে আপনার সমস্ত শাখা তৈরি করেন তবে আপনার সর্বদা আপনার প্রবাহ শাখাটি স্বয়ংক্রিয়ভাবে সেট হয়ে যাবে।

function con { git checkout -b $1 && git push --set-upstream origin $1; }

$ 1 আপনার পরে পাস করা প্রথম যুক্তি উপস্থাপন করে conতাই এটি করার মতো:

git checkout -b my-new-branch && git push -u my-new-branch

... কেবল এটি করে:

con my-new-branch

5

সংক্ষিপ্ত উত্তর

আপনি যদি প্রকৃতপক্ষে স্পষ্ট হতে চান এবং -uপ্রয়োজনে বিকল্পটি ব্যবহার করতে চান তবে কেবল পুরোটি টাইপ করতে চান না:

git push -u origin foo

তারপরে আপনি নীচের নামটি ব্যবহার করতে পারেন:

[alias]
    push-u = !git push -u origin $(git symbolic-ref --short HEAD)

এবং সহজভাবে টাইপ করুন:

git push-u

দীর্ঘ উত্তর

সাধারণত, -u(শর্টহ্যান্ডের জন্য --set-upstream) প্রয়োজন যখন তখনই আমরা একটি নতুন স্থানীয় শাখা তৈরি করি এবং প্রতিশ্রুতিবদ্ধ করি এবং আমরা এটিকে প্রবাহিত করতে চাই। রিমোট রিপোজিটরিতে এখনও নতুন শাখা নেই, সুতরাং কমিটকে চাপ দেওয়ার আগে আমাদের দূরবর্তী শাখাটি তৈরি এবং ট্র্যাক করার জন্য গিট বলতে হবে। এটি কেবল শাখায় প্রথম ধাক্কা দেওয়ার জন্য প্রয়োজনীয়। এখানে একটি সাধারণ দৃশ্য:

git checkout -b foo         # Create local branch
git commit -m "Foo"         # Create local commit
git push -u origin foo      # Create and track remote branch, and push commit
git commit -m "Bar"         # Create local commit
git push                    # Push commit

ব্যক্তিগতভাবে, আমি git push -uরিমোট শাখা তৈরি করার সময় এটির সাথে সুস্পষ্ট হওয়া প্রয়োজনটির মতো করি : এটি একটি দুর্দান্ত তাৎপর্যপূর্ণ অপারেশন, একটি সম্পূর্ণ নতুন শাখা বিশ্বের কাছে ভাগ করে নেওয়া।

যাইহোক, আমি ঘৃণা করি যে আমাদের স্পষ্টভাবে লিখতে হবে git push -u origin foo। এটি কেবল টাইপ করতে ব্যথা নয়, তবে আরও গুরুত্বপূর্ণ, এটি বেশ ত্রুটি-প্রবণ! শাখার নাম টাইপ করার সময় ভুল করা সহজ, এবং নতুন দূরবর্তী শাখায় আপনার স্থানীয় শাখার মতো নাম থাকবে না! বেশিরভাগ ক্ষেত্রেই, আপনি চাইছেন প্রবাহের সংগ্রহস্থল originএবং আপস্ট্রিম শাখার আপনার স্থানীয় শাখার নাম একই থাকে।

অতএব, আমি আমার মধ্যে নিম্নলিখিত উপনামটি ব্যবহার করছি .gitconfig, যা মার্ক প্রদত্ত দুর্দান্ত উত্তরের একটি উপসেট :

[alias]
    push-u = !git push -u origin $(git symbolic-ref --short HEAD)

এখন, আমরা নিম্নলিখিতটি করতে পারি, যা এখনও স্পষ্ট, তবে কম ত্রুটিযুক্ত:

git checkout -b foo         # Create local branch
git commit -m "Foo"         # Create local commit
git push-u                  # Create and track remote branch, and push commit
git commit -m "Bar"         # Create local commit
git push                    # Push commit

3

কেবল:

$ alias gush="git push -u origin HEAD"

4
প্রশ্নের শিরোনাম: "গ-পুশ কনফিগার করে কীভাবে স্বয়ংক্রিয়ভাবে আপ-স্ট্রিম সেট আপ করতে পারেন?" বর্ণনা: "আমি জানি git push -u, কিন্তু ..."। সুতরাং এটি প্রশ্নের উত্তর দেয় না।
জন

4
@ জন আমি একটি সাধারণ ওরফে পরামর্শ দেওয়ার জন্য আমার উত্তর আপডেট করেছি।
djanowski

4
@ জন এখন কি প্রশ্নের উত্তর দেয়?
djanowski

4
@ আই এলআই 4 এস কে 4 আরআইএম ধন্যবাদ, এটি অত্যন্ত উত্তেজনাপূর্ণ যে আমার উত্তরটি সবচেয়ে সহজ, তবুও এটি -1 ¯_ (ツ) _ / ¯
djanowski

2

আপনি যদি কম কম কীপ্রেস সহ অন্তর্নির্মিত গিট বৈশিষ্ট্যগুলি ব্যবহার করতে চান তবে কেবল টাইপ করুন:

$ git push -u o tab H tab

এবং স্বতঃপূরণ আপনাকে দেবে $ git push -u origin HEAD

ওএসএক্স-এ অটোকম্পলেট সক্ষম করতে এই বিষয়বস্তু সহ একটি ~/.git-completition.bashফাইল সেট আপ করুন এবং আপনার ফাইলে নিম্নলিখিত লাইনগুলি যুক্ত করুন এবং আপনার টার্মিনালটি পুনরায় চালু করুন:~/.bash_profile

# git branch autocomplete
if [ -f ~/.git-completion.bash ]; then
  . ~/.git-completion.bash
fi
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

এটি বিল্ট-ইন টার্মিনালগুলিকেও প্রভাবিত করে, যেমন vscode এর মতো etc.


4
স্বয়ংসম্পূর্ণ? গিটের স্বয়ংসম্পূর্ণতা নেই। আপনার শেল (বাশ? Zsh?) এর স্বয়ংসম্পূর্ণ নিয়মের একটি সেট লোড হয়েছে। আপনি স্বতঃসম্পূর্ণ নিয়মের কোন সেটটি ব্যবহার করছেন এবং সেগুলি কোথায় পাবেন সে সম্পর্কিত তথ্য সরবরাহ করতে পারেন?
vy32

ওহ, কৃতজ্ঞ ধন্যবাদ। আমি আমার স্বয়ংসম্পূর্ণ সেটিংস দিয়ে আমার উত্তরটি সম্পূর্ণ করেছি।
গাজডেগারগো

আপনার ফাইল contents / .git- সমাপ্তি.বাশ এর সামগ্রীগুলি না জেনে আপনার উত্তরটি কার্যকর হয় না।
vy32

4
ভাল যুক্তি. আমি আমার উত্স খুঁজে পেয়েছি git-completition.bashএবং আমার উত্তরে যুক্ত করেছি।
গজডেগারগো

1

আমি এগুলি সহ দরকারী স্ক্রিপ্টগুলির সাথে একটি গিট এক্সটেনশন করেছি:

usage: git line push

Push the current branch and set an upstream if needed.

https://github.com/jvenezia/git-line


0

যদি যাই হোক না কেন, অন্য উত্তরগুলির কোনও আপনার পক্ষে কাজ করে না, তবে আপনি git pushযখন প্রয়োজন তখন সঠিক পতাকাগুলির সাথে স্বয়ংক্রিয়ভাবে পুশ অনুরোধটি পুনরায় প্রেরণের জন্য এই ব্যাশ ফাংশনটির বিকল্প দিতে পারেন ।

gitpush()
{
    git push -v 2>&1 | # perform push command, pipe all output
    tee /dev/tty | # keep output on screen and pipe it forward
    (
     cmd=$(sed -n "s/^.*\(git push --set-upstream origin .*\)$/\1/p");
     [[ -n "${cmd// }" ]] && (echo "> $cmd"; eval $cmd);
    ) # if we get output that matches the command to perform, execute it
}

আপনি পুশ আউটপুট এর অগ্রগতি অংশ বলিদান করা হবে, কিন্তু সবকিছু ব্যতীত প্রত্যাশা হিসাবে কাজ করে।

ব্যক্তিগতভাবে, আমি জেটি জোবের উত্তরটি ব্যবহার করব ।

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