নন-বেয়ার গিট সংগ্রহস্থলের দিকে কীভাবে চাপ দেবেন?


150

আমি সাধারণত ssh (স্ক্রিন এবং ভিআইএম) এর মাধ্যমে একটি রিমোট সার্ভারে কাজ করি, যেখানে আমার গিট সংগ্রহস্থল রয়েছে। কখনও কখনও আমি অনলাইনে থাকি না, তাই আমার ল্যাপটপে আমার পৃথক সংগ্রহস্থল (আমার দূরবর্তী থেকে ক্লোন করা) থাকে।

তবে আমি এই সংগ্রহস্থলটি দূরবর্তী দিক থেকে টানতে পারি না কারণ আমি সাধারণত ফায়ারওয়ালের পিছনে থাকি বা আমার কোনও সার্বজনীন আইপি থাকে না।

আমি পড়েছি যে আমার কেবল খালি ভাণ্ডারের দিকে ধাক্কা দেওয়া উচিত। তারপরে কীভাবে আমার পরিবর্তনগুলি আমার দূরবর্তী সংগ্রহস্থলে ঠেকানো উচিত?


সম্পর্কিত: stackoverflow.com/questions/12265729/...
prusswan

3
2 টি রিমোট রেপো, একটি খালি এবং একটি সাধারণ এবং হুক ব্যবহার করুন। ঝামেলার মতো মনে হচ্ছে, তবে গিট প্রস্তুত এবং অফিসিয়াল গিট উইকি অনুসারে আপনার কেবল খালি রেপোতে চাপ দেওয়া উচিত । এটি সম্ভবত কেন অধিকাংশ Git রেপো হোস্ট (যেমন GitHub, Bitbucket) অন্তর্ভুক্ত পোস্ট গ্রহণ আঙ্গুলসমূহ, তাই আপনি আপনার সার্ভারে একটি URL যা একটি স্ক্রিপ্ট রান পোস্ট করতে পারেন যে উদাহরণস্বরূপ, executes git pull github master
জ্যাক বার্গার

উত্তর:


137

receive.denyCurrentBranch updateInstead

এই বিকল্পগুলি গিট ২.৩ এ যুক্ত করা হয়েছে এবং এটি পরিষ্কার থাকলে সার্ভারটি তার কার্যকারী গাছটিকে আপডেট করে।

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

নমুনা ব্যবহার:

git init server
cd server
touch a
git add .
git commit -m 0
git config --local receive.denyCurrentBranch updateInstead

cd ..
git clone server local
cd local
touch b
git add .
git commit -m 1
git push origin master:master

cd ../server
ls

আউটপুট:

a
b

হিরকু যেমন খালি রেপো তৈরি না করেই কি ধাক্কা দেওয়া সম্ভব
ANINJa

2
@ আনিনজে আমি বুঝতে পারছি না, আমার উদাহরণটি ঠিক এটিই করে না?
সিরো সান্তিলি 郝海东 冠状 病 六四 事件

হয় --localঐচ্ছিক?
ইউকুল্লি

@ ইউকুল্লি --localকেবলমাত্র বর্তমান ডিরেক্টরিকে --globalপ্রভাবিত করে ~/.gitconfig, দেখুন সমস্ত গিট রিপোকে প্রভাবিত করে , দেখুন man git-config
সিওরো সান্তিলি :15 冠状 病 六四 事件 法轮功

1
ধন্যবাদ @ সিরোসন্টিলি 新疆 改造 中心 六四 事件 法轮功 ডকটি পড়ে আমি নিশ্চিত করেছিলাম যে এটি প্রয়োজনীয় নয় "(আপনি বলতে পারেন - স্থানীয় কিন্তু এটি ডিফল্ট)"
ইউকুল্লি

146

সেরা বিকল্প

সম্ভবত আপনার নন-রিয়ার রিপোজিটরিতে pushোকানোর সবচেয়ে শুদ্ধতম, ন্যূনতম বিভ্রান্তিকর এবং নিরাপদতম উপায় হ'ল রিমোটের উত্সর্গীকৃত শাখাগুলি যা আপনার ল্যাপটপের শাখাগুলি উপস্থাপন করে।

আসুন সহজ কেসটি দেখুন, এবং ধরে নিন যে প্রতিটি রেপোতে আপনার কেবলমাত্র একটি শাখা রয়েছে: মাস্টার। আপনি যখন ল্যাপটপ থেকে রিমোট রেপোতে চাপ দিন, তখন মাস্টার -> মাস্টারকে চাপ দেওয়ার পরিবর্তে - মাস্টার চাপুন -> ল্যাপটপ-মাস্টার (বা কোনও অনুরূপ নাম) name এইভাবে ধাক্কা দূরবর্তী রেপোতে বর্তমানে চেক-আউট মাস্টার শাখাকে প্রভাবিত করে না। ল্যাপটপ থেকে এটি করতে, কমান্ডটি বেশ সহজ:

git push origin master:laptop-master

এর অর্থ স্থানীয় মাস্টার শাখা দূরবর্তী সংগ্রহস্থলের "ল্যাপটপ-মাস্টার" নামক শাখায় ঠেলে দেওয়া হবে। আপনার রিমোট রেপোতে, আপনার কাছে "ল্যাপটপ-মাস্টার" নামে একটি নতুন শাখা থাকবে যা আপনি প্রস্তুত হওয়ার পরে আপনার দূরবর্তী মাস্টারে মার্জ করতে পারবেন।

বিকল্প বিকল্প

কেবল মাস্টার -> মাস্টারকে ধাক্কা দেওয়াও সম্ভব, তবে বর্তমানে একটি নন-বেয়ার রেপোর চেক-আউট শাখার দিকে ধাক্কা দেওয়া সাধারণত সুপারিশ করা হয় না, কারণ আপনি যদি বুঝতে না পারছেন তবে এটি বিভ্রান্তিকর হতে পারে। এর কারণ এটি একটি চেক-আউট শাখায় ঠেলাঠেলি কাজের গাছ আপডেট করে না, তাই git statusচেক-আউট শাখায় যাচাই করা হয়েছে তা চূড়ান্তভাবে বিপরীত পার্থক্যগুলি দেখাবে যা সাম্প্রতিকভাবে ধাকানো হয়েছিল। কাজের গাছটি ধাক্কা দেওয়ার আগে ময়লা থাকলে এটি বিশেষত বিভ্রান্ত হবে, যা এটি সুপারিশ না করার একটি বড় কারণ।

আপনি যদি কেবল মাস্টার -> মাস্টারকে চাপ দেওয়ার চেষ্টা করতে চান তবে কমান্ডটি কেবলমাত্র:

git push origin

কিন্তু আপনি যখন রিমোট রেপোতে ফিরে যান, আপনি সম্ভবত সম্ভবত এমন git reset --hard HEADকাজটি করতে চেষ্টা করতে চান যা ধাক্কা খেয়েছে এমন সামগ্রীর সাথে সিঙ্কযুক্ত হয়ে উঠবে। এটি বিপজ্জনক হতে পারে , কারণ যদি আপনি এটি রাখতে চেয়েছিলেন এমন রিমোট ওয়ার্ক ট্রিে কোনও আপত্তিজনক পরিবর্তন হয় তবে সেগুলি মুছবে। আপনি এটি চেষ্টা করার আগে এর পরিণতিগুলি কী তা জানেন তা নিশ্চিত হয়ে নিন বা কমপক্ষে প্রথমে ব্যাকআপ করুন!

সম্পাদনা গিট ২.৩ থেকে, আপনি "পুশ-টু-ডিপ্লয়" গিট পুশ ব্যবহার করতে পারেন: https://github.com/blog/1957-git-2-3-has-been- রিলেজড । তবে একটি পৃথক শাখায় ঠেলাঠেলি করা এবং তারপরে মার্জ করা সাধারণত ভাল হয় কারণ এটি আসল সংশ্লেষ করে (তাই একীভূত পরিবর্তনের সাথে যেমন মার্জ যেমন হয় তেমন কাজ করে)।


1
ল্যাপটপ-মাস্টারকে চাপ দেওয়ার পরে কী শাখাটি স্বয়ংক্রিয় করা সম্ভব?
rdoubleui

3
@rdoubleui: আপনি "স্বয়ংক্রিয় বলতে চাইছেন মার্জ "? যদি তাই হয় তবে না, মার্জটি স্বয়ংক্রিয় করা সম্ভব নয় কারণ একীভূতকরণ মানুষের হস্তক্ষেপ ছাড়াই সম্ভব হওয়ার গ্যারান্টিযুক্ত নয়। বিবাদ হতে পারে যার সমাধানের প্রয়োজন।
ড্যান মোল্ডিং

7
পরবর্তী সংস্করণগুলিতে (?), git config receive.denyCurrentBranch ignoreনন-বেয়ার
রেপোগুলিতে

3
মহান উত্তর @ ড্যানমোল্ডিং, ধন্যবাদ। @rdoubleui: আপনি সবসময় নীচের মত একটি কমান্ড লাইন বাশ ফাংশন হিসাবে সংরক্ষণ করতে পারেন:git push origin master:laptop-master && ssh user@remotemachine 'cd repos_path && git merge laptop-master'
সমৃদ্ধ

@rdoubleui মার্জটি স্বয়ংক্রিয় করতে, আপনি গিটোলাইট ব্যবহার করতে পারেন এবং সেট আপ করতে পারেন (কিছুটা জটিল) নন-বেয়ারকে সমস্ত কিছু নোংরা করার জন্য এবং প্রাক-গিট ট্রিগার ব্যবহার করে এটি গিটোলাইট (খালি) সংস্করণে ঠেলাতে পারেন। এর পরে যদি খালি খালি মধ্যে মার্জিংয়ের সমাধান করা যায় না, এটি আপনার ধাক্কাটিকে প্রত্যাখ্যান করবে, তাই আপনি জানেন যে আপনাকে প্রথমে টানতে হবে, সংযুক্তিগুলি সমাধান করতে হবে এবং আবার চাপ দিতে হবে। আমি এখনও এটি সেট আপ করি নি, তবে আমি প্রক্রিয়াধীন এবং মনে করি এটি কার্যকর হতে পারে।

17

আমি আপনার সার্ভারে একটি খালি-সংগ্রহস্থল এবং স্থানীয় ওয়ার্কিং (নন-বেয়ার) রেপো রাখার পরামর্শ দেব। আপনি ল্যাপটপ থেকে সার্ভার বেয়ার রেপোতে পরিবর্তনগুলি ঠেকাতে পারেন এবং তারপরে সেই বেয়ার রেপো থেকে সার্ভার ওয়ার্কিং রেপোতে টানতে পারেন। আমি এটি বলার কারণ হ'ল সার্ভারে আপনার অনেকগুলি সম্পূর্ণ / অসম্পূর্ণ শাখা থাকতে পারে যা আপনি ল্যাপটপে প্রতিলিপি করতে চাইবেন।

এইভাবে আপনাকে সার্ভারে পরিবর্তনগুলি ঠেকানোর সময় সার্ভার ওয়ার্কিং রেপোতে শাখাটির অবস্থা সম্পর্কে চিন্তা করতে হবে না।


4

অন্য বিকল্পটি হ'ল একটি বিপরীত এসএসএস টানেল সেটআপ করা যাতে আপনি পুশের পরিবর্তে টানতে পারেন।

# start the tunnel from the natted box you wish to pull from (local)
$ ssh -R 1234:localhost:22 user@remote

# on the other box (remote)
$ git remote add other-side ssh://user@localhost:1234/the/repo
$ git pull other-side

এবং আপনি যদি পটভূমিতে টানেলটি চালাতে চান

$ ssh -fNnR 1234:localhost:22 user@remote

1

আপনি করতে পারেন:

$git config --bool core.bare true

এটি খালি বা কেন্দ্রীয় সংগ্রহস্থলে করা যেতে পারে যাতে এটি নন রিপোজিটরিগুলি থেকে চাপানো কোনও ফাইলই গ্রহণ করবে will আপনি যদি নন বেয়ার স্টোরেজে এটি করেন তবে আমরা নন বেয়ার থেকে বেয়ার স্টোরগুলিতে কোনও ফাইল ঠেলে দিতে পারি না।

আপনি যদি পিসিতে সেন্ট্রাল এবং নন বেয়ার রেপো তৈরি করে জিআইটি অনুশীলন করেন তবে এটি কোনও পিসির ধাক্কাযুক্ত ফাইলগুলি না দেখাতে পারে তবে এটি পুশ হয়েছে। আপনি এটি চালিয়ে পরীক্ষা করতে পারেন।

$git log কেন্দ্রীয় রেপো।

আপনি যদি গিটহাবের দিকে ধাক্কা দেন তা ব্যতীত এটি সেখানে ফাইলগুলি প্রদর্শন করবে।

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