আমি কীভাবে কোনও মেশিনে একাধিক ব্যবহারকারীর সাথে গিট সংগ্রহস্থলটি ভাগ করব?


216

আমার একটি স্টেজিং সার্ভারে একটি গিট সংগ্রহস্থল রয়েছে যা একাধিক বিকাশকারীকে টানতে সক্ষম হতে হবে। git-initআমি যা খুঁজছি তার খুব কাছাকাছি একটি পতাকা রয়েছে বলে মনে হচ্ছে: --sharedকেবলমাত্র একাধিক লোকেরা rep ভান্ডারটিতে টানতে চাই। git-cloneএর --sharedপতাকা কিছু সম্পূর্ণরূপে পৃথক করে।

বিদ্যমান ভাণ্ডারের অনুমতিগুলি পরিবর্তন করার সবচেয়ে সহজ উপায় কী?


আমি "উইন্ডোজ ফর গিথাব" ব্যবহার করছি এবং দুটি গিথুব অ্যাকাউন্টের মধ্যে স্যুইচ করছি: স্ট্যাকওভারফ্লো
অ্যালিসা

উত্তর:


186

অনুমতিগুলি একটি কীটপতঙ্গ।

মূলত, আপনাকে অবশ্যই নিশ্চিত করতে হবে যে এই সমস্ত বিকাশকারীরা গিট রেপোতে সমস্ত কিছু লিখতে পারেন।

একদল বিকাশকারীকে লেখার ক্ষমতা দেওয়ার উচ্চতর পদ্ধতির জন্য দ্য নিউ-ওয়েভ সলিউশনটিতে যান।

স্ট্যান্ডার্ড সমাধান

আপনি যদি সমস্ত বিকাশকারীকে একটি বিশেষভাবে তৈরি গ্রুপে রাখেন তবে আপনি নীতিগতভাবে কেবল এটি করতে পারেন:

chgrp -R <whatever group> gitrepo
chmod -R g+swX gitrepo

তারপরে umaskব্যবহারকারীদের জন্য পরিবর্তিত করুন 002, যাতে নতুন লিখিত ফাইলগুলি গ্রুপ-লেখার অনুমতি নিয়ে তৈরি হয়।

এটির সাথে সমস্যাগুলি সৈন্যবাহিনী; যদি আপনি এমন কোনও ডিস্ট্রোতে umaskরয়েছেন যা ধরে নিয়েছে 022(যেমন একটি সাধারণ usersগ্রুপ রয়েছে যার মধ্যে সবাইকে ডিফল্টরূপে অন্তর্ভুক্ত করা হয়) তবে এটি অন্য কোথাও সুরক্ষা সমস্যাগুলি খুলতে পারে। এবং যত তাড়াতাড়ি বা পরে, কিছু আপনার সাবধানতার সাথে তৈরি কারুকৃত অনুমতিগুলির স্কিমটিকে স্ক্রু করতে চলেছে, যতক্ষণ না আপনি rootঅ্যাক্সেস না পেয়ে এবং এটি ঠিক না করা পর্যন্ত রেপোটিকে বাইরে রেখে দেয় (যেমন, উপরের আদেশগুলি পুনরায় চালানো)।

নিউ-ওয়েভ সলিউশন

একটি উচ্চতর সমাধান - যদিও কম ভাল বোঝা যায়, এবং যার জন্য আরও বেশ কয়েকটি ওএস / সরঞ্জাম সমর্থন প্রয়োজন P এটি পসিক্স এক্সটেন্ডেড অ্যাট্রিবিউট ব্যবহার করে use আমি সম্প্রতি এই অঞ্চলে মোটামুটিভাবে এসেছি, সুতরাং আমার জ্ঞানটি যতটা গরম তা হতে পারে না। তবে মূলত, একটি বর্ধিত এসিএল হ'ল 3 টি ডিফল্ট স্লট (ব্যবহারকারী / গ্রুপ / অন্যান্য) এর চেয়ে বেশিের জন্য অনুমতি সেট করার ক্ষমতা ability

সুতরাং আবার আপনার গ্রুপ তৈরি করুন, তারপরে চালান:

setfacl -R -m g:<whatever group>:rwX gitrepo
find gitrepo -type d | xargs setfacl -R -m d:g:<whatever group>:rwX

এটি গ্রুপটির জন্য বর্ধিত এসিএল সেট আপ করে যাতে গ্রুপ সদস্যরা ইতিমধ্যে সেখানে উপস্থিত ফাইলগুলি (প্রথম লাইন) পড়তে / লিখতে / অ্যাক্সেস করতে পারে; তারপরে, সমস্ত বিদ্যমান ডিরেক্টরিগুলিও বলুন যে নতুন ফাইলগুলিতে এই একই এসিএল প্রয়োগ করা উচিত (দ্বিতীয় লাইন)।

আশা করি আপনার পথে পাবে


62
git init --hared নামে একটি প্যারামিটার রয়েছে যা গ্রুপ কাজের জন্য কোর.শ্রেডরেপোসিটরি ভেরিয়েবল সেট আপ করে। আপনি একটি বিদ্যমান সংগ্রহস্থলটিতে ভেরিয়েবল সেট করতে পারেন। এটি উমাস্ককে ম্যানুয়ালি সেট করার প্রয়োজনীয়তা অপসারণ করে যেমন গিট ফাইলগুলি ম্যানিপুলেট করার আগে এটি একটি বুদ্ধিমানের মান হিসাবে সেট করে।
পিটিম্যান

6
পসিক্স বর্ধিত বৈশিষ্ট্যের জন্য +1 - আমার কাছে খবর!
রবএম

5
যখন আমি chmod -R g+swXএটি করেছি , এটি গিটকে খুব অসন্তুষ্ট করেছিল এবং এটি সিদ্ধান্ত নিয়েছিল যে এটি আর কোনও গিটার সংগ্রহস্থল নয় ("রেপো কোনও গিট সংগ্রহস্থল হিসাবে উপস্থিত হবে না")। আমি সমস্ত ফাইল জিএসএম chmod ছিল । শুধু setgid বিট সেট করতে ডিরেক্টরি , চেষ্টা find /path/to/repo -type d -print0 | xargs -0 chmod g+s। তবুও করুন chgrp -R thegroup /path/to/repo
রিডিস্ক

10
chmod -R g+swX gitrepoফাইলগুলিতে সেটগুইড বিট প্রয়োগ করবে এটি একটি সুরক্ষা ঝুঁকি। পরিবর্তে, আপনি find . -type d -exec chmod g+s {} +এটি কেবল ডিরেক্টরিতে প্রয়োগ করতে পারেন ।
ইয়ান ডান

1
এসিএল (সেটফ্যাকল) এর গ্রুপ আইডি উত্তরাধিকার সূত্রে ডিরেক্টরিতে নির্মিত নতুন ফাইল এবং উপ-ডিরেক্টরিগুলি প্রয়োগ করার জন্য সেটগিডের জন্য সেটিং নেই। অতএব, আপনাকে chmod এর মাধ্যমে আলাদাভাবে সেটগিড সেট করতে হবে। গিটের - শেয়ার্ড বিকল্প ( git-scm.com/docs/git-init ) তবে আপনাকে ব্যবহারকারীর উমাস্ককে সেটগিড এবং ওভাররাইড করতে দেয়।
চেজ টি।

121

আপনি যদি সংগ্রহস্থল তৈরি করেন (বা একটি বিদ্যমান একটি নতুন খালি রেপো ক্লোন করেছেন) দিয়ে

$ git init --shared=group 

অথবা

$ git init --shared=0NNN

গিটটি আপনার ডিফল্ট উমাস্ক যা সরবরাহ করে তার উপরে এবং তার বাইরেও অনুমতিগুলি পরিচালনা করার কথা। শেষ পর্যন্ত এটি আমার গিট সংস্করণে সত্য (1.6.3)। অবশ্যই এটি ধরে নিয়েছে আপনার ব্যবহারকারীরা একই গ্রুপে আছেন।

যদিও আমার পড়া / লেখার বিভিন্ন ডিগ্রি সহ একাধিক গ্রুপের ব্যবহারকারীদের পরিচালনা প্রয়োজন, আমি গিটোসিস সহ যাব। আমি গিটোলাইটের কথাও শুনেছি ( http://github.com/sitaramc/gitolite ), একটি গিটোসিস কাঁটা যা শাখা স্তরের অনুমতি দেওয়ার জন্য অনুমিত হয়, আমি বলতে পারি না যে আমি প্রত্যেকে এটি ব্যক্তিগতভাবে ব্যবহার করেছি।


9
এটি অবশ্যই সঠিক উত্তর।
এলিওটিটিসিবল

4
আমার এই সমস্যাটি ছিল এবং এটি এখন পর্যন্ত সেরা উত্তর। একমাত্র সমস্যা হ'ল --sharedযুক্তিটি হেক্সাডেসিমাল নয়, একটি অষ্টাল গ্রহণ করে। আমি গিট 1.7.8 এর উত্সে এটি নিশ্চিত করেছি এবং দ্বিতীয় উদাহরণটি হওয়া উচিত git init --shared=0NNN
কিপিংগু

3
কি NNN-permissions মাস্ক বা একটি গোষ্ঠীর সংখ্যা বা অন্য কিছু?
ক্রেগ ম্যাককুইন

20
উপরের বিটিডব্লিউ, "গ্রুপ" একটি কীওয়ার্ড, আপনার গ্রুপ নামের জন্য স্থানধারক নয়। আপনি chgrp কমান্ড ব্যবহার করে গ্রুপটি বরাদ্দ করেন। একটি নতুন git init --bare --shared=group myprojরেপুর জন্য এটি যেখানে মাইপ্রজ আপনার রেপো নাম, তারপরে মাইগ্রুপটি chgrp -R mygroup myprojআপনার গ্রুপের নাম।
ল্যাব্রাডোর্ট

2
শীর্ষস্থানীয় যে আপনার ব্যবহারকারীরা যদি কমিট করেন তবে তাদের ডিফল্ট গোষ্ঠীটি যা হওয়া উচিত তার থেকে আলাদা হলে তা জিনিসগুলি স্ক্রু আপ করতে পারে। এই সমস্যাটি সমাধানের জন্য, আপনার প্রতিটি ব্যবহারকারীর রেপোতে থাকা প্রতিটি ফাইল সঠিক গ্রুপে chgrp করতে হবে। এটি প্রতিপন্ন হবে যতক্ষণ না আপনি প্রতিশ্রুতিবদ্ধ এবং চাপ দেওয়ার আগে ডান গ্রুপের অধীনে / নতুন ফাইলগুলিকে কীভাবে তৈরি / স্যুইচ করবেন everyone
ragerdl

55

এটি বলা হয়নি, তাই আমি দ্রুত এটি যুক্ত করতে চাই।

অনুমতিগুলি ইস্যুগুলি তাদের কুশ্রী মাথাটি ক্রপ না করে তা নিশ্চিত করার জন্য, আপনার গিট শেয়ার্ড রিপোজিটরির কনফিগারেশন ফাইলে নিম্নলিখিতটি সেট করতে ভুলবেন না:

[core]
    sharedRepository = true

এটি নিশ্চিত করবে যে আপনার সিস্টেমের "উমাস্ক" সেটিংস সম্মানিত।


6
Git -config (1) ( kernel.org/pub/software/scm/git/docs/git-config.html ) core.sharedRepository অনুসারে গিট সম্মানের জন্য আপনার এটিকে "উমাস্ক" বা "মিথ্যা" হিসাবে সেট করা দরকার ব্যবহারকারীর উমাস্ক
ডেভিড স্মিট

14
এই এবং ব্যবহারকারীর 35117 উত্তর সঠিক। মনে রাখবেন যে "সত্য" "গ্রুপ" এর সমান এবং এটি আদেশ দ্বারা সেট করা যেতে পারে git config core.sharedRepository true
কলিনম

এটি কোনও ফাইলকে রিমোটে ঠেলে দেওয়ার পরেও কি এটির মালিকানা পরিবর্তন করে?
ডাচ ট্রান

2
যখন আপনি আসলে পরে বদলে ক্লোনিং এই সেট আপ করতে চান তাহলে, সমতুল্য git init --sharedহয় git clone --config core.sharedRepository=true। এই --sharedজাতীয় অনুরূপ কমান্ডগুলিতে এই জাতীয় অর্থের জন্য গিটের অদ্ভুত ব্যবহার ।
stevek_mcc

21

গীত ইউজার ম্যানুয়াল বর্ণনা কিভাবে একটি সংগ্রহস্থলের ভাগ বিভিন্নভাবে।

আরও জটিল, যদিও সংগ্রহস্থলগুলি ভাগ করে নেওয়ার বৈশিষ্ট্য পূর্ণ উপায়:

আমরা 6 বিকাশকারীদের একটি দলের জন্য গিটহাব ব্যবহার করি।


1
আমি গিটোসিস পছন্দ করি। সর্বজনীন কীগুলির উপর ভিত্তি করে অ্যাক্সেস নিয়ন্ত্রণের এটি বেশ কার্যকর উপায়।
মাইক মাজুর

এই সমাধানগুলির কোনওটি কীভাবে "আমি একাধিক লোকেরা সেই ভাণ্ডারটিতে টানতে চাই" এর সমস্যার সমাধান করতে পারি?
দোলা

গিটোসিস দেখে নিন। যে আপনার সমস্যার সমাধান করে।
পাইলিফ

3
আপনি যখন সংগ্রহস্থলটি ভাগ করবেন, লোকেরা এ থেকে তা টানতে সক্ষম হবে। তাদের সম্ভবত এটি ক্লোন করা বা একটি দূরবর্তী শাখা যুক্ত করতে হবে। আমি লিঙ্কযুক্ত ডকুমেন্টেশন আপনার সমস্যা সমাধানের জন্য খুব স্পষ্টভাবে আপনাকে চলবে; গিটের সাথে সোর্স কোডটি ডেভেলপারদের সহযোগিতা করতে আমি বর্ণিত সমস্ত পদ্ধতি ব্যবহার করেছি। আমার জ্ঞানের কাছে সার্ভারফল্ট হ্যান্ডহোল্ডিংয়ের জন্য নয়।
jtimberman

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

9

আপনার গিট সংগ্রহস্থল হোস্ট করার জন্য গিটোলাইটটিও দেখুন । গিটোসিস স্পষ্টতই আর বিকশিত হচ্ছে না।


4

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

মনে করুন /myrepo.git এ আপনার একটি ভাগ করা সংগ্রহস্থল রয়েছে। সেই সংগ্রহস্থলের সমস্ত ফাইলই মাইগ্রেডগ্রুপ বলে । সমস্ত ব্যবহারকারীরা সেই সংগ্রহস্থলের দিকে চাপ দিচ্ছেন তাদের মাইগ্রেডগ্রুপেরও অন্তর্ভুক্ত থাকা উচিত । এখন নিম্নলিখিত ফাইলটি তৈরি করুন ( আপনার পছন্দগুলিতে ম্যারেডগ্রুপটি পরিবর্তন করছেন ):

/myrepo.git/hooks/post-update

#!/bin/sh
chmod -R g+w . 2>/dev/null
chgrp -R mysharedgroup . 2>/dev/null

যখন ব্যবহারকারীদের বিভিন্ন ডিফল্ট গোষ্ঠী থাকে তার জন্য সঠিক উত্তর
প্যাট

ডিরেক্টরিতে সেটগিড বিট সেট করার ফলে ব্যবহারকারীরা যে ফাইলগুলি ডিরেক্টরি হিসাবে একই গ্রুপের মালিকানার অধিকারী করতে পারে (যদি ব্যবহারকারীরা সেই গোষ্ঠীর অন্তর্ভুক্ত থাকে)। এমনকি এটি ব্যবহারকারীদের ডিফল্ট গ্রুপ না হলেও। তাহলে এই হুকের দরকার নেই। @ ওম্বলের উত্তর (এবং এটিতে আমার মন্তব্য) এটিই করে।
22

আমার সেন্টোস 7 মেশিনে, এই পৃষ্ঠায় তালিকাভুক্ত প্রতিটি সমাধান চেষ্টা করার পরে, উপরে @ বি কেএমএসএসের সমাধানের একটি বৈকল্পিকই কেবলমাত্র একটি বিকল্প ছিল যা কার্যত কাজ করেছিল (উপরের মতো পোস্ট-আপডেটের পরিবর্তে পোস্ট-মার্জ এবং পোস্ট-চেকআউট হুক সেট করে)।
মাইক গডিন

আমি মনে করি যে এটি সমাধানের প্রচারের পক্ষে খারাপ পরামর্শ যা STDER এ ত্রুটি বার্তা বা সতর্কতাগুলি পাইপ করে /dev/null। ব্যবহারকারীকে প্রথমে এই বার্তাগুলি দেখতে দিন এবং তারপরে তাদের নিজেরাই সিদ্ধান্ত নিতে দিন।
ড্যানিয়েল বোহ্মার

3

নতুন রেপো স্থাপন সম্পর্কে বিভিন্ন উত্তর এবং মন্তব্য থেকে বিট এবং ভাল পরামর্শের টুকরোগুলি একত্রিত করতে:

আপনি যদি এই গোষ্ঠীর জন্য একেবারে নতুন রেপো myrepoস্থাপন /srv/gitকরেন তবে mygroupআপনি যা চান তা এই:

mkdir /srv/git/myrepo.git
chgrp mygroup /srv/git/myrepo.git
git init --bare --shared /srv/git/myrepo.git
  1. প্রথম লাইন রেপো dir তৈরি
  2. দ্বিতীয় লাইনটি তার গ্রুপ সেট করে mygroup
  3. তৃতীয় লাইনটি নিম্নলিখিত কনফিগারেশন সহ একটি বেয়ার রেপো সূচনা করে:
    1. core.bare = true: এটি একটি খালি রেপো তৈরি করুন
    2. core.sharedrepository = 1(একই হিসাবে core.sharedrepository = group): পরে তৈরি করা রেপো ডিরেক্টরি এবং সমস্ত ডিরেক্টরিগুলি mygroupপড়ার, লেখার এবং অনুমতিগুলি সম্পাদনের অনুমতি দেওয়ার জন্য গিট দ্বারা পরিচালিত হবে (স্যাজিড বিট সেট পাশাপাশি - যাতে ব্যবহারকারীদের সাথে কাজ করার জন্য তাদের mygroupনয়) প্রাথমিক দল)
    3. receive.denyNonFastforwards = 1: অস্বীকার করুন অ-দ্রুত-ফরোয়ার্ড রেপোতে ধাক্কা দেয়

আপনি যদি ব্যবহারকারী, গোষ্ঠী, বা অন্যান্য ব্যবহারকারীর অনুমতিগুলি সূক্ষ্ম-টিউন করতে চান --shared=0NNN, যেখানে ফাইলেরNNN জন্য প্রমিত ব্যবহারকারী, গোষ্ঠী এবং অন্যান্য বিট রয়েছে ( ডিরেক্টরিতে এক্সিকিউট এবং সাজিদ বিটগুলি গিট দ্বারা যথাযথভাবে পরিচালিত হবে)। উদাহরণস্বরূপ, এটি ব্যবহারকারীর পড়ার এবং লেখার অ্যাক্সেস এবং কেবলমাত্র গ্রুপে পঠনযোগ্য অ্যাক্সেসের (এবং অন্যের অ্যাক্সেসের অনুমতি দেয়):

git init --bare --shared=0640 /srv/git/myrepo.git

এটি ব্যবহারকারী এবং গোষ্ঠীতে পড়ার এবং লেখার অ্যাক্সেসের অনুমতি দেয় (এবং অন্যের অ্যাক্সেস নেই):

git init --bare --shared=0660 /srv/git/myrepo.git

এটি ব্যবহারকারী এবং গোষ্ঠীতে পঠন এবং লেখার অ্যাক্সেস এবং অন্যটিতে কেবল পঠনযোগ্য অ্যাক্সেসের অনুমতি দেয়:

git init --bare --shared=0664 /srv/git/myrepo.git

মনে রাখবেন যে আপনি যদি এই গোষ্ঠীতে লেখার অ্যাক্সেসের অনুমতি না দিয়ে যাচ্ছেন তবে প্রথমে chownরেপোর মালিক সেট করতে ব্যবহার করার বিষয়টি নিশ্চিত করুন এবং তারপরে git initসেই ব্যবহারকারী হিসাবে কমান্ডটি চালান (এটি নিশ্চিত করার জন্য যে রেপো সঠিক মালিকের সাথে আরম্ভ করা হয়েছে) সমস্ত প্রাথমিক ফাইল এবং উপ ডিরেক্টরি)।


উচ্চতর প্রতিক্রিয়ার চেয়ে সঠিক More
XO01

2

সংগ্রহস্থলটি ভাগ করতে আপনি গিট-ডেমন ব্যবহার করতে পারেন। আরও তথ্যের জন্য গিট-ডেমনের জন্য ডকুমেন্টেশন পড়ুন ।

সম্পাদনা করুন:

আপনার গিট সংগ্রহস্থলটি ভাগ করার জন্য এই নিবন্ধটি 8 টি উপায়ও দেখুন


1

হুবহু কাজটি করা আমার জন্য, বিদ্যমান ভান্ডারগুলির জন্য কাজ করেছিল। এটি এর আগে বেশ কয়েকটি উত্তর এবং মন্তব্যগুলির পরামর্শ গ্রহণ করে:

আপনার রিপোজিটরি প্যারেন্ট ডিরেক্টরি থেকে সার্ভারে:

chgrp -R <whatever group> gitrepo
chmod -R g+wX gitrepo
cd gitrepo
find . -type d -exec chmod g+s {} +
git config core.sharedRepository group

0

আমি যখন এই প্রশ্নটির জন্য গুগল করছিলাম তখন @ স্টেভেক_মিসি উত্তরটিই আমি খুঁজছিলাম

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