গিট: কেবল একটি ফেচ-রিমোট সেট আপ করবেন?


132

আমি যখন git remote -vআমার গিট সংগ্রহস্থলগুলিতে চালিত করি যেখানে রিমোট (গুলি) কনফিগার করা আছে, আমি দেখতে পাচ্ছি যে প্রতিটি রিমোটে আনতে এবং ধাক্কা উভয়ই থাকে:

$ git remote -v
<remote-name> ssh://host/path/to/repo (fetch)
<remote-name> ssh://host/path/to/repo (push)

রিমোটগুলির জন্য যা পিয়ার বিকাশকারীদের দিকে নির্দেশ করে সেখানে ধাক্কা দেওয়ার দরকার নেই এবং গিট কোনওভাবেই নন-বেয়ার স্টোরেজে যেতে অস্বীকার করবে। কোনও ধাক্কা ঠিকানা বা ক্ষমতা ছাড়াই এই রিমোটগুলি "কেবল আনতে হবে" হিসাবে কনফিগার করার কোনও উপায় আছে?


4
@ না, না, আপনি পারবেন না। কোনও পুশ ইউআরএল নির্দিষ্ট না করে, পুশগুলি আনতে URL টি ব্যবহার করবে।
yoyo

উত্তর:


191

আমি মনে করি না আপনি পুশ ইউআরএলটি সরিয়ে ফেলতে পারবেন , আপনি এটি টান URL ছাড়া অন্য কিছু হতে ওভাররাইড করতে পারেন । সুতরাং আমি মনে করি আপনি যে নিকটতম স্থানটি পাবেন এটি হ'ল কিছু:

$ git remote set-url --push origin no-pushing
$ git push
fatal: 'no-pushing' does not appear to be a git repository
fatal: The remote end hung up unexpectedly

আপনি এতে পুশ ইউআরএল সেট করছেন no-pushingযা আপনার কার্য ডিরেক্টরিতে যতক্ষণ না একই নামের ফোল্ডার না থাকে ততক্ষণ গিটটি সনাক্ত করতে সক্ষম হবে না। আপনি প্রয়োজনীয়ভাবে গিটকে এমন কোনও অবস্থান ব্যবহার করতে বাধ্য করছেন যা অস্তিত্বহীন।


14
হ্যাঁ, আপনি ভাবেন যে "গিট রিমোট সেট-ইউআরএল - ডিলিট - পুশ। *" কৌশলটি করতে পারে তবে আপনি যদি পুশ ইউআরএলটি মুছে ফেলেন তবে এটি ফিচার ইউআরএলে ফিরে ডিফল্ট হবে।
yoyo

6
আমি ব্যক্তিগতভাবে আরও বেশি দৃশ্যমান ' ডিসএলভয়েড ' এর মতো কিছু ব্যবহার পছন্দ করি । তবে এটি কেবল স্বাদের বিষয়।
পিয়েরে-অলিভিয়ের ভেরেস

@ পিয়েরে-অলিভিয়ারভেয়ারস 'ডনটপুশ' সম্পর্কে কী ?! :)
আলী শাকিবা

অবগতির জন্য, এই আপনার Git কনফিগ ফাইল করছেন পরে এই মত হওয়া উচিত: (উল্লেখ্য নতুন pushurl বিকল্প) [দূরবর্তী "উৎপত্তি"] আনা =, + refs / মাথা / *: refs / রিমোটের / উৎপত্তি / * URL = SSH: // হোস্ট / পাথ / টু / রেপো পুশুরল = এসএসএস: // হোস্ট / নো-পুশিং / রেপো
জয়ওয়িলিয়ামস

1
একইভাবে @ পিয়েরে-অলিভিয়ারভেয়ার্সেও আমি গিয়েছিলাম git remote set-url --push origin -- --read-only--- --শীর্ষস্থানীয় ড্যাশগুলির সাথে কোনও নামের অনুমতি দেওয়ার জন্য অতিরিক্ত নোট করুন । এটি আমার কাছে আরও পাঠযোগ্য মনে হয়েছিল।
লিন্ডস

13

অকার্যকর কিছুতে (যেমন, git remote set-url --push origin DISABLED) পুশ ইউআরএল পরিবর্তন করা ছাড়াও কেউ pre-pushহুক ব্যবহার করতে পারে ।

থামানোর একটি দ্রুত উপায় হুক git pushহ'ল সিমলিংক /usr/bin/falseকরা:

$ ln -s /usr/bin/false .git/hooks/pre-push
$ git push
error: failed to push some refs to '...'

একটি হুক ব্যবহার করা যদি আকাঙ্ক্ষিত হয় তবে পুশের আরও সূক্ষ্ম কন্ট্রোল নিয়ন্ত্রণের অনুমতি দেয়। .git/hooks/pre-push.sampleকার্য-অগ্রগতি কমিটিকে কীভাবে ঠেকানো যায় তার উদাহরণ দেখুন ।

একটি নির্দিষ্ট শাখায় ঠেলাঠেলি ঠেকাতে বা একক শাখায় পুশিং সীমাবদ্ধ করার জন্য এটি উদাহরণস্বরূপ হুক:

$ cat .git/hooks/pre-push
#!/usr/bin/sh

# An example hook script to limit pushing to a single remote.
#
# This hook is called with the following parameters:
#
# $1 -- Name of the remote to which the push is being done
# $2 -- URL to which the push is being done
#
# If this script exits with a non-zero status nothing will be pushed.

remote="$1"
url="$2"

[[ "$remote" == "origin" ]]

একাধিক রিমোটেস সহ একটি পরীক্ষার রেপো:

$ git remote -v
origin  ../gitorigin (fetch)
origin  ../gitorigin (push)
upstream        ../gitupstream (fetch)
upstream        ../gitupstream (push)

এতে চাপ দেওয়ার originঅনুমতি রয়েছে:

$ git push origin
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 222 bytes | 222.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To ../gitorigin
 * [new branch]      master -> master

অন্য কোনও রিমোটে পুশ করার অনুমতি নেই:

$ git push upstream
error: failed to push some refs to '../gitupstream'

নোট করুন যে pre-pushহুক স্ক্রিপ্টটি অন্য জিনিসগুলির মধ্যে পরিবর্তিত হতে পারে, স্ট্ডারকে একটি বার্তা মুদ্রণ করে বলে যে পুশটি অক্ষম করা হয়েছে।


ভাল ধারণা! আরও বিস্তৃত স্ক্রিপ্ট না থাকলে আপনি সমস্ত রিমোটেসের জন্য ধাক্কা অক্ষম করতে পারবেন।
v01pe

1
@ v01pe হ্যাঁ। একটি উদাহরণ স্ক্রিপ্ট অন্তর্ভুক্ত করার জন্য আমি উত্তর আপডেট করেছি। একটি একক শাখায় পুশ ফিল্টার করার জন্য এটি খুব বেশি প্রয়োজন হয় না। একটি শেল oneliner করতে হবে।
রোডলফো কারভালহো

4

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

এই উত্তরটি একটি সহজ ব্যাখ্যা দেয়: https://stackoverflow.com/a/2933656/1866402

(আমি এটি উত্তর হিসাবে যুক্ত করছি কারণ আমার কাছে মন্তব্য যুক্ত করার মতো যথেষ্ট খ্যাতি নেই)


সংজ্ঞা অনুসারে একটি খালি সংগ্রহস্থলের কোনও চেক আউট ওয়ার্কিং ডিরেক্টরি নেই। আপনি এটিতে কোনও নির্দিষ্ট শাখায় ঠেলাঠেলি করতে পারেন।,
এড র‌্যান্ডাল

1

যদি আপনার ইতিমধ্যে একটি রিমোট সেটআপ রয়েছে এবং যদি নিজেকে দুর্ঘটনাক্রমে সরাসরি masterবা অন্যদিকে চাপ দেওয়ার মতো কিছু করা থেকে বিরত রাখতে চান তবে আপনি এটি release/productionব্যবহার করে আটকাতে পারবেন git config

# prevent pushing to branch: master
$ git config branch.master.pushRemote no_push

# prevent pushing to branch: release/production
$ git config branch.release/production.pushRemote no_push

রেকর্ডের জন্য, no_pushকোনও বিশেষ নাম নয়। এটি কেবল কোনও অস্তিত্বহীন শাখার নাম। সুতরাং আপনি ব্যবহার করতে পারে$ git config branch.master.pushRemote create_a_pr_and_do_not_push_directly_to_master এবং এটি ঠিক কাজ করবে।

আরও তথ্য: গিট-কনফিগারেশনের পুশরেমোট


0

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


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