গিট পুশ ত্রুটি '[রিমোট প্রত্যাখ্যাত] মাস্টার -> মাস্টার (শাখাটি বর্তমানে চেক আউট করা হয়েছে)'


961

গতকাল, আমি কীভাবে আমার একটি মেশিন থেকে অন্য মেশিনে গিট সংগ্রহস্থলটি ক্লোন করতে পারি সে সম্পর্কে একটি প্রশ্ন পোস্ট করেছি, আমি কীভাবে অন্য মেশিন থেকে 'গিট ক্লোন' করব?

আমি এখন সফলভাবে আমার উত্স (192.168.1.2) থেকে আমার গন্তব্য (192.168.1.1) এ একটি গিট সংগ্রহস্থল ক্লোন করতে সক্ষম হয়েছি।

তবে আমি যখন কোনও ফাইল, এ git commit -a -m "test"এবং এ এডিট করেছিলাম তখন আমি git pushআমার গন্তব্যে এই ত্রুটিটি পাই (192.168.1.1):

git push                                                
hap@192.168.1.2's password: 
Counting objects: 21, done.
Compressing objects: 100% (11/11), done.
Writing objects: 100% (11/11), 1010 bytes, done.
Total 11 (delta 9), reused 0 (delta 0)
error: refusing to update checked out branch: refs/heads/master
error: By default, updating the current branch in a non-bare repository
error: is denied, because it will make the index and work tree inconsistent
error: with what you pushed, and will require 'git reset --hard' to match
error: the work tree to HEAD.
error: 
error: You can set 'receive.denyCurrentBranch' configuration variable to
error: 'ignore' or 'warn' in the remote repository to allow pushing into
error: its current branch; however, this is not recommended unless you
error: arranged to update its work tree to match what you pushed in some
error: other way.
error: 
error: To squelch this message and still keep the default behaviour, set
error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To git+ssh://hap@192.168.1.2/media/LINUXDATA/working
! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'git+ssh://hap@192.168.1.2/media/LINUXDATA/working'

আমি গিটের দুটি ভিন্ন সংস্করণ (দূরবর্তীটিতে 1.7 এবং স্থানীয় মেশিনে 1.5) ব্যবহার করছি। এটি কি কোনও সম্ভাব্য কারণ?


5
কোনও পুরানো টাইমার স্ট্যাকওভারফ্লো.com/a/9283833/397872 এর গৃহীত উত্তরটি পরিবর্তন করতে এবং থ্রেডটিকে সংরক্ষণাগার বা অন্য কিছুতে স্থানান্তর করতে পারে? নাকি মালিকানা বদলাই বা যাই হোক?
রিশ্তা

9
আপনি আসলে এখন গীত 2.3.0 (ফেব্রুয়ারি 2015) সহ একটি অ খালি রেপো থেকে ধাক্কা কোনও সুরক্ষিত উপায় আছে এবং git config receive.denyCurrentBranch=updateInstead: stackoverflow.com/a/28262104/6309
VonC

এটিই বইটির নতুন লিঙ্ক যা @ স্টিগি উল্লেখ করেছেন: git-scm.com/book/en/v1/Git-on-the- সার্ভার
আবদুলিলাহ এল আইসৌই


তবে আমি বুঝতে পারি না কেন এটি এবং কীভাবে কাজ করে? এটা 'কাজ, হ্যাঁ কিন্তু সব।
তিলক ম্যাডি

উত্তর:


1149

আপনি কেবল আপনার দূরবর্তী সংগ্রহস্থলটিকে খালি সংগ্রহস্থলীতে রূপান্তর করতে পারেন (খালি ভাণ্ডারে কোনও কার্যকরী অনুলিপি নেই - ফোল্ডারে কেবল আসল সংগ্রহস্থল ডেটা থাকে)।

আপনার দূরবর্তী সংগ্রহস্থল ফোল্ডারে নিম্নলিখিত কমান্ডটি প্রয়োগ করুন:

git config --bool core.bare true

তারপরে সেই ফোল্ডারটি বাদে সমস্ত ফাইল মুছুন .git। এবং তারপরে আপনি git pushকোনও ত্রুটি ছাড়াই দূরবর্তী সংগ্রহস্থলে সঞ্চালন করতে সক্ষম হবেন ।


4
ধন্যবাদ। আমারও এটি দরকার ছিল আমি গিট কমিউনিটি বইয়ের সাবমডিউলস টিউটোরিয়ালটি অনুসরণ করে এই রোডব্লকটিকে হিট করেছি।
শিকি

6
আমি নিশ্চিত কিনা সার্ভার, বা ক্লায়েন্টের উপর ফাইল মুছে দিন বোঝানো হয় না ছিল ... তাই আমি ডিলিট কিছুই করেনি এবং সমস্যা দূরে পর মাত্র করছেন যায় git config --bool core.bare true। কিছু ফাইল মুছে ফেলার প্রয়োজন আছে কি? যদি তা হয় তবে কী মুছে ফেলা দরকার তার বিষয়ে আপনি আরও সুনির্দিষ্ট হতে পারেন?
ব্রায়ান ভ্যান্ডেনবার্গ

24
এটি সর্বোত্তম সম্ভাব্য উত্তর এবং অন্য কেউ এটিকে গর্ত ইন্টারভেইসগুলিতে সরবরাহ করেন নি। আমি মনে করি যে আমরা সবাই একই ত্রুটি বার্তাটি গুগল করেছি এবং আমরা সকলেই এটি পড়ে অত্যন্ত খুশি হয়েছিল।
সেবাস্তিয়ান গ্রিগনোলি

40
যদিও এটি পুরো প্রচুর ভোট পেয়েছে, আমি মনে করি না যে এটি এই নির্দিষ্ট প্রশ্নের সত্যই যথেষ্ট উত্তর। কীভাবে পরিষ্কারভাবে একটি বেয়ার রেপো তৈরি করতে হয় তা ব্যবহারকারীকে নির্দেশ দেওয়া অর্ধেক খারাপ হতে পারে, তবে ফাইলগুলি যদি চেক আউট রাখা দরকার হয়, উদাহরণস্বরূপ, যখন এটি দুটি কম্পিউটারে ব্যবহারকারীরা কাজ করছেন তখন os
কোথাও কোনও মানুষ নেই

9
উত্স রেপো খালি করা পরিবর্তন করা ওভারকিল। যেমন @Robert পয়েন্ট আউট আপনি সব করতে প্রয়োজন, উৎস রেপো একটি নতুন শাখা পুশ হল: stackoverflow.com/a/2933656/402949
ড্যান সলোভে

707

গিট শিখতে শুরু করার সময় আমার ঠিক একই ত্রুটি হয়েছিল । অন্যান্য উত্তরগুলির মধ্যে কিছু পরিষ্কারভাবে গিতের জন্য নতুন কারোর জন্য নয়!

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

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

আশা করি এটা কাজে লাগবে.


76
+1 আরও অনেক সহায়ক, রবার্টকে ধন্যবাদ। আমি আমার ক্ষেত্রে খালি রেপোতে রূপান্তরিত করার কোনও মানে করি না। কেবল যে শাখায় আপনি চাপ দেওয়ার চেষ্টা করছেন তা কেবল 'নিষ্ক্রিয়' করতে হবে। বোধ হয়।
এরিক ময়েসার

32
@ এফএমএজ ২০০৮: মাত্র একটি ডামি শাখা তৈরি করুন (গিট চেকআউট-বি ডামি)
ডারর কোহেন

14
ম্যান এটি সর্বাধিক ভোট দেওয়া উত্তরের চেয়ে ভাল :) ধন্যবাদ যদিও অন্য
উত্তরটিও

102
শুধু এই আরও পরিস্কার করা, রেপো ধাক্কা লক্ষ্য যে দেখুন: git checkout -b tmp। তারপর সোর্সে রেপো: git push। তারপরে লক্ষ্যমাত্রায় ফিরে আসা (.চ্ছিক):git checkout master; git branch -d tmp
হরি করম সিং

18
হরির মন্তব্যটি সহজতম রেসিপি। আমি কেবল বলতেই পারি যে গিটটি বিভিন্ন উপায়ে দুর্দান্ত হতে পারে, এসএনএন বা সম্ভবত অন্য কোনও আরভি থেকে এসেছে, এই পুরো জিনিসটি অত্যাশ্চর্যরকম নয় u
নিঃশর্তপরিবর্তনমোনিকা

128

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

দুটি নন-বেয়ার স্টোরের মধ্যে কাজ করার সবচেয়ে সহজ উপায় হয়

  1. সর্বদা টান (বা আনুন এবং মার্জ করুন) দ্বারা সংগ্রহগুলি আপডেট করুন অথবা, যদি আপনার,

  2. একটি পৃথক শাখায় চাপ দিয়ে (একটি আমদানি শাখা) এবং তারপরে সেই শাখাটি দূরবর্তী মেশিনে মাস্টার শাখায় মার্জ করে।

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

এটি দুর্ঘটনাক্রমে এমন একটি পরিবর্তন আনা খুব সহজ করে তোলে যা সমস্ত ধাক্কা দেওয়া পরিবর্তনকে পূর্বাবস্থায় ফিরিয়ে দেয় এবং স্থানীয়, যে প্রতিশ্রুতিবদ্ধ হয় নি এবং নতুন HEAD, সূচক এবং কার্যকারী গাছের মধ্যে পার্থক্য রয়েছে তার মধ্যে পার্থক্য করা খুব কঠিন করে তোলে ধাক্কা চলমান দ্বারা সৃষ্ট HEAD


1
ধন্যবাদ। তাহলে আমি কীভাবে আমার সমস্যার সমাধান করতে পারি? আমার 192 বাক্সে, আমি '$ সিডি (প্রকল্প-ডিরেক্টরি) $ গিট থ্রি $ (কিছু ফাইল যুক্ত) it গিট অ্যাড করেছি। এবং তারপরে আমার ১৯১ বাক্সে আমি 'গিট ক্লোন' করেছি এবং কিছু ফাইল সম্পাদনা করেছি এবং 'গিট পুশ' করার চেষ্টা করেছি।
hap497

16
ঠিক আছে, আমি আমার উত্তরে সম্ভাবনার বর্ণনা দিয়েছি। হয় আপনি 192 বাক্সে যেতে পারেন এবং 191 বাক্স থেকে আনতে পারেন (আপনি নামকরণ করা দূরবর্তী হিসাবে 191 বাক্সটি যুক্ত করতে চান - দেখুন git remote add box191 <191url>), বা আপনি 191 বাক্স থেকে বিকল্প নামের একটি শাখায় ঠেলাতে পারেন (উদাহরণস্বরূপ git push origin master:refs/heads/upload), তারপরে 192 বাক্সে এবং মার্জ (যেমন git merge upload) eg
সিবি বেইলি

3
গিট ২.৩.০ (ফেব্রুয়ারী ২০১৫) এবং স্ট্যাকওভারফ্লো.com/a/28262104 git config receive.denyCurrentBranch=updateInstead/ 6309 : দিয়ে আপনার নন-বেয়ার রেপোতে চাপ দেওয়ার নিরাপদে উপায় এখন আপনার কাছে রয়েছে : আপনার আর বিকল্প 2 এর দরকার নেই।
ভনসি

122

সারসংক্ষেপ

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

খালি সংগ্রহস্থলগুলির কোনও শাখা চেক আউট না হওয়ায় আপনি সর্বদা খালি ভাণ্ডারের যে কোনও শাখায় যেতে পারেন।

আপনার প্রয়োজনের উপর নির্ভর করে একাধিক সমাধান রয়েছে।

সমাধান 1: একটি বেয়ার স্টোর ব্যবহার করুন

প্রস্তাবিত হিসাবে, যদি একটি মেশিনে থাকে তবে আপনার কার্যক্ষম ডিরেক্টরি প্রয়োজন নেই, আপনি একটি খালি সংগ্রহস্থলে যেতে পারেন। সংগ্রহস্থলটির সাথে গোলযোগ এড়াতে, আপনি কেবল এটি ক্লোন করতে পারেন:

machine1$ cd ..
machine1$ mv repo repo.old
machine1$ git clone --bare repo.old repo

এখন আপনি যা চান তার আগের মতো একই ঠিকানায় চাপ দিতে পারেন।

সমাধান 2: একটি চেক-না-করা শাখায় পুশ করুন

তবে আপনার যদি আপনার রিমোটের কোডটি পরীক্ষা করে দেখার দরকার হয় <remote>তবে আপনি চাপ দেওয়ার জন্য একটি বিশেষ শাখা ব্যবহার করতে পারেন। ধরা যাক যে আপনার স্থানীয় সংগ্রহস্থলে আপনি আপনার রিমোট কল করেছেন originএবং আপনি শাখা মাস্টারে আছেন। তাহলে আপনি করতে পারেন

machine2$ git push origin master:master+machine2

তারপরে আপনি যখন originরিমোট রেপোতে থাকবেন তখন আপনাকে এটি মার্জ করতে হবে :

machine1$ git merge master+machine2

সমস্যার ময়না তদন্ত

যখন একটি শাখা চেক আউট হয়, প্রতিশ্রুতিবদ্ধ বর্তমান শাখার প্রধানকে তার পিতামাতা হিসাবে একটি নতুন প্রতিশ্রুতি যুক্ত করে এবং শাখার প্রধানকে সেই নতুন প্রতিশ্রুতি হিসাবে স্থানান্তরিত করে।

সুতরাং

A ← B
    ↑
[HEAD,branch1]

হয়ে

A ← B ← C
        ↑
    [HEAD,branch1]

তবে কেউ যদি সেই শাখাকে অভ্যন্তরীণ দিকে ঠেলে দিতে পারে তবে ব্যবহারকারী গিট কলকে কীভাবে আলাদা করতে হবে তা মাথা হেড মোডে পেয়ে যাবে:

A ← B ← X
    ↑   ↑
[HEAD] [branch1]

স্পষ্টভাবে অন্য কোনও শাখা পরীক্ষা করে দেখার জন্য জিজ্ঞাসা না করে এখন ব্যবহারকারী আর শাখা 1 এ নেই। সবচেয়ে খারাপ, ব্যবহারকারী এখন যে কোনও শাখার বাইরে রয়েছে এবং যে কোনও নতুন প্রতিশ্রুতি কেবল ঝুঁকির মধ্যে পড়বে :

      [HEAD]
        ↓
        C
      ↙
A ← B ← X
        ↑
       [branch1]

হাইপোথিটিক্যালি, যদি এই মুহুর্তে, ব্যবহারকারী অন্য একটি শাখা পরীক্ষা করে দেখেন, তবে এই ঝুঁকিপূর্ণ প্রতিশ্রুতি গিটের আবর্জনা সংগ্রাহকের পক্ষে ন্যায্য খেলায় পরিণত হয় ।


3
"ময়নাতদন্ত" - তে একটি প্রযুক্তিগত সংশোধন: গিট আসলে HEADপুশ-টু স্টোরগুলিতে বিচ্ছিন্ন হবে না । HEADতবুও শাখার দিকে নির্দেশ করবে এবং শাখাটি নতুন প্রতিশ্রুতিগুলিকে ধাক্কা দেবে; তবে কার্যকরী ডিরেক্টরি এবং সূচক / স্টেজিং-অঞ্চলটি সংশোধিত হবে। যে কেউ এখন পুশ-টু স্টোরেজে কাজ করছে তাকে পুশের প্রভাবগুলি থেকে পুনরুদ্ধার করতে কঠোর পরিশ্রম করতে হবে: সংরক্ষণের কোনও পরিবর্তন আছে কিনা তা নির্ধারণ করুন এবং যদি যত্ন সহকারে সেগুলি সংরক্ষণের ব্যবস্থা করেন।
23:40

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

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

আমি আমার সার্ভারে একটি জিআইটি ফোল্ডার তৈরি করেছি যা সোর্স ট্রি ব্যবহার করে একাধিক ব্যবহারকারী দ্বারা তৈরি সমস্ত সংগ্রহস্থল হোস্ট করবে। আমি masterআমার স্থানীয় পিসিতে একটি সংগ্রহস্থল তৈরি করেছি। আমি remotesসার্ভার ফোল্ডারে যুক্ত করেছিলাম এবং আমার সংগ্রহশালাটিকে সার্ভারে ঠেলে দেওয়ার চেষ্টা করছি যাতে অন্য কোনও ব্যবহারকারী এটিকে কাজ করতে টানতে / আনতে পারে। আমি নিম্নলিখিত ত্রুটি ! [remote rejected] master -> master (branch is currently checked out)পেয়েছি : আমি কীভাবে এটি পরীক্ষা করতে পারি?
ফরজক্লানজ

1
@ সন্ধান ফরোকনজ, আপনি কি বুঝতে পেরেছেন যে আমি ঠিক যে প্রশ্নের উত্তর দিচ্ছি তা জিজ্ঞাসা করছেন ?!
কোথাও কোনও মানুষ নেই

65

.git/configগন্তব্য সার্ভারে সম্পাদনা করে আপনি এই "সীমাবদ্ধতা" পেতে পারেন । গিট সংগ্রহস্থলটিকে "চেক আউট" করা সত্ত্বেও তা ঠেলে দেওয়ার জন্য নিম্নলিখিতটি যুক্ত করুন:

[receive]
denyCurrentBranch = warn

অথবা

[receive]
denyCurrentBranch = false

প্রথমটি শাখাটিকে বিশৃঙ্খলা করার সম্ভাবনা সম্পর্কে সতর্ক করার সময় ধাক্কা দেবে, অন্যদিকে এটি কেবল চুপচাপ এটির অনুমতি দেবে।

এটি কোনও সার্ভারে কোড "স্থাপন" করতে ব্যবহৃত হতে পারে যা সম্পাদনা করার উদ্দেশ্যে নয়। এটি সেরা পদ্ধতির নয়, তবে কোড মোতায়েনের জন্য দ্রুত one


7
কোনও সার্ভারে "স্থাপন" কোড ব্যবহার করে এটি কাজ করবে না। এমনকি যদি আপনি সতর্কতাটি অক্ষম করে থাকেন তবে আপনি চেক আউট শাখায় ঠেলাঠেলি করতে পারেন, ওয়ার্কিং কপিটি কোনও ধাক্কায় আপডেট হয় না।
অ্যারোমাস্টার

10
cd .. && git reset --hardপোস্ট-রিসিভ হুক ব্যবহার করার জন্য আমি উপরের পদ্ধতিটি ব্যবহার করছি । হ্যাকিশ, কিন্তু কাজ করে।
ঝোলস্টার

9
পরবর্তী কমান্ড লাইন সংস্করণটি হবেgit config receive.denyCurrentBranch warn
আন্দ্রে হল্জনার

4
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। আমাদের মধ্যে কেউ কেউ জানে আমরা কী করছি এবং গিট শুরুর দিকে নয়। এই এই লোকদের জন্য উত্তর।
কিউস - মনিকা 24

2
হা, কিন্তু প্রশ্নটি সেই ব্যক্তিদের বাইট জিজ্ঞাসা করা হয়নি
কোথাও কোনও মানুষ

46

git config --local receive.denyCurrentBranch updateInstead

https://github.com/git/git/blob/v2.3.0/Documentation/config.txt#L2155

সার্ভারের সংগ্রহস্থলটিতে এটি ব্যবহার করুন এবং যদি কোনও চিহ্নবিহীন ওভাররাইট না ঘটে তবে এটি কার্যকারী ট্রিটিকে আপডেট করে।

এটা যোগ করা হয়েছিল গীত 2.3 যেমন VonC উল্লেখ মন্তব্য।

আমি গিট ২.৩ সংকলন করেছি এবং চেষ্টা করেছি। নমুনা ব্যবহার:

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

হ্যাঁ, bধাক্কা!


@ ভনসি ধন্যবাদ! কর্মক্ষেত্রে ন্যূনতম উদাহরণগুলির সাথে এটি আমার আবেগ :-)
সিরো সান্তিলি 法轮功 病毒 审查 六四 事件 法轮功

সার্ভারের সাথে আপ টু ডেট না হওয়া পরিবর্তনগুলি নিয়ে কি এই সমস্যা আছে?
আকোজি

@ অাকোজি আমি নিশ্চিত না যে আপনি কী বোঝাতে চেয়েছিলেন, যদি আপনি টান দেওয়ার আগে স্থানীয়ভাবে প্রতিশ্রুতিবদ্ধ হন তবে এটি --bareআমার মনে হয় একটি traditional তিহ্যবাহী ক্লোন হিসাবে হুবহু আচরণ করবে : --forceধাক্কা দেওয়ার প্রয়োজন, এবং এটি আপনাকে রিমোটে "হারাতে" বাধ্য করবে।
সিরো সান্তিলি 法轮功 病毒 审查 六四 事件

1
@ সিরোস্যান্টিলি 新疆 改造 中心 六四 事件 法轮功 এখন কোনও উদ্বেগ নেই। আমি বিকল্পগুলির অর্থ সন্ধান করলাম। আমি ভেবেছিলাম আপডেট আপডেটটি শক্তির সমার্থক ছিল।
আকোজি

updateInstead আর receive.denyCurrentBranch জন্য একটি বৈধ মান
Xalorous

41

আমি এখনও রিমোট বাক্সে ব্যবহারযোগ্য সংগ্রহস্থল রাখার ধারণাটি পছন্দ করি তবে একটি ডামি শাখার পরিবর্তে, আমি এটি ব্যবহার করতে পছন্দ করি:

git checkout --detach

এই একটি খুব নতুন বৈশিষ্ট্য আছে বলে মনে হয় গীত - আমি Git সংস্করণ 1.7.7.4 ব্যবহার করছি।


8
এবং তারপরে আপনার পরিবর্তনগুলি ঠেকানোর পরে, আপনি ব্যবহার করতে পারেন: git checkout masterমাস্টার শাখায় ফিরে যেতে। তবেই আপনার পরিবর্তনগুলি প্রয়োগ করা হচ্ছে।
মজডাক

30

আমারও একই প্রশ্ন ছিল. আমার জন্য, আমি আমার সার্ভারগুলিতে কোড সরিয়ে নিতে গিট পুশ ব্যবহার করি। আমি সার্ভারের পাশের কোডটি কখনই পরিবর্তন করি না, তাই এটি নিরাপদ।

সংগ্রহস্থলে, আপনি টাইপ করতে চাপ দিচ্ছেন:

git config receive.denyCurrentBranch ignore

এটি আপনাকে ওয়ার্কিং কপি করার সময় ভান্ডারটি পরিবর্তন করতে দেয়।

আপনি গিট পুশ চালানোর পরে, রিমোট মেশিনে যান এবং এটি টাইপ করুন:

git checkout -f

এটি আপনার চাপ দেওয়া পরিবর্তনগুলি দূরবর্তী মেশিনের ওয়ার্কিং কপির প্রতিফলিত করবে।

দয়া করে মনে রাখবেন, আপনি চাপ দিচ্ছেন এমন ওয়ার্কিং কপিটিতে পরিবর্তন আনলে এটি সর্বদা নিরাপদ নয়।


একটি লগ ধন্যবাদ, আমি আপনার পরামর্শ মার্জ denyCurrentBranchএবং এখানে পোস্ট জ্যাক- git checkout -fhooks
সেনাচাল

এই কমান্ডটি না করেই দূরবর্তী সংগ্রহস্থলগুলিতে ফাইলগুলি উপস্থিত করার কোনও উপায় আছে কি? যথা স্থানীয় একটি আদেশ দ্বারা?
রই

24

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

আপনার রিমোট সার্ভারে:

mkdir myrepo.git
cd myrepo.git
git init --bare

ঠিক আছে, আপনার স্থানীয় শাখা থেকে:

git push origin master:master

3
ধন্যবাদ এটিই আমার জন্য সমাধান ছিল কারণ আমি দূরবর্তী সার্ভারে '--bare' বাদ দিয়েছিলাম। দেখে মনে হচ্ছে এই প্রশ্নের উত্তরগুলি নির্ভর করে আপনি রিমোট সার্ভার রেপোকে একটি কার্যনির্বাহী ডিরেক্টরি হিসাবে ব্যবহার করছেন কিনা এবং পরবর্তী ক্ষেত্রে এটি সঠিক উত্তর।
Cas

2
আমি বুঝতে পারছি না: এসআই একটি বেয়ার রেপো তৈরি এবং ক্লোন করার চেষ্টা করেছিল, তবে ক্লোন কিছুই ডাউনলোড করেনি এবং কিছুই আপলোড করে না, তাই এটি কাজ করছে না ... :-) আমি খালি রেপো সম্পর্কে টিউটোরিয়াল পড়েছি, কিন্তু তারা বলেছে যে একটি খালি রেপো কোনও ফাইল নেই ... এটি অবশ্যই আমি যা খুঁজছি তা নয় ...
inf3rno

22

আপনি সম্ভবত এটির কারণ হিসাবে কি করেছেন:

এই জাতীয় জিনিসটি ঘটে যখন আপনি একটি সামান্য প্রোগ্রাম ঠেকাতে যান। আপনি এমন কিছু পরিবর্তন করতে চলেছেন যা ইতিমধ্যে কাজ করে যাচ্ছিল, তাই আপনি আপনার লেভেল -3 এর চিরস্থায়ী অযোগ্যতার অক্ষর:

machine1:~/proj1> git init

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

machine2:~> git clone ssh://machine1/~/proj1

এবং এটি ক্লোন করে এবং সবকিছু দেখতে ভাল লাগে এবং তাই আপনি মেশিন 2 থেকে আপনার কোডটিতে কাজ করেন।

তারপরে ... আপনি মেশিন 2 থেকে আপনার প্রতিশ্রুতিগুলি ঠেলে দেওয়ার চেষ্টা করুন এবং শিরোনামে সতর্কতা বার্তাটি পাবেন।

এই বার্তার কারণ হ'ল আপনি যে গিট রেপোটি টেনেছেন সেটি মেশিন 1-এ folder ফোল্ডারের জন্য ব্যবহার করার ইচ্ছা ছিল। আপনি এটিকে ঠিকঠাক থেকে ক্লোন করতে পারেন তবে ধাক্কা দিয়ে সমস্যা দেখা দিতে পারে। দুটি ভিন্ন স্থানে কোড পরিচালনা করার "যথাযথ" উপায়টি একটি "বেয়ার" রেপো সহ, যেমনটি প্রস্তাবিত হয়েছে। একটি খালি রেপো কোন কাজ করা হচ্ছে বলে ডিজাইন করা হয় না এটা, এটা একাধিক উত্স থেকে করে তুল্য বোঝানো হয়। এ কারণেই শীর্ষ-রেট করা উত্তরটি আপনার পরে .git ফোল্ডার বাদে সমস্ত ফাইল / ফোল্ডার মোছার পরামর্শ দেয় git config --bool core.bare true

শীর্ষস্থানীয় উত্তরটি পরিষ্কার করা: এর উত্তরের বেশিরভাগ মন্তব্যে এমন কিছু বলা হয়েছে যে "আমি মেশিন 1 থেকে অ-গিট ফাইলগুলি মুছলাম না এবং আমি এখনও মেশিন 2 থেকে প্রতিশ্রুতিবদ্ধ করতে সক্ষম হয়েছি"। সেটা ঠিক. তবে, অন্যান্য ফাইলগুলি এখন গিট রেপো থেকে সম্পূর্ণ "তালাকপ্রাপ্ত" are git statusসেখানে চেষ্টা করুন এবং আপনার "মারাত্মক: এই ক্রিয়াকলাপটি অবশ্যই একটি কাজের গাছে চালানো উচিত" এর মতো কিছু দেখতে হবে। সুতরাং, ফাইলগুলি মুছে ফেলার পরামর্শটি এমন নয় যাতে মেশিন 2 থেকে প্রতিশ্রুতি কাজ করবে ; এটি যাতে আপনি বিভ্রান্ত না হন এবং মনে করেন যে গিটটি এখনও এই ফাইলগুলি ট্র্যাক করছে। তবে, আপনি যদি এখনও মেশিন 1 এর ফাইলগুলিতে কাজ করতে চান তবে ফাইলগুলি মুছে ফেলা সমস্যা?

সুতরাং, আপনি আসলে কি করা উচিত?

আপনি এখনও মেশিন 1 এবং মেশিন 2 তে কতটা কাজ করার পরিকল্পনা করছেন তার উপর নির্ভর করে ...

আপনি যদি মেশিন 1 থেকে বিকাশ সম্পন্ন করে ফেলেছেন এবং আপনার সমস্ত বিকাশকে মেশিন 2 এ সরিয়ে নিয়েছেন ... শীর্ষস্থানীয় উত্তরের পরামর্শ অনুসারে কেবল তাই করুন: git config --bool core.bare trueএবং তারপরে, বিকল্প হিসাবে, সেই ফোল্ডার থেকে .git ব্যতীত সমস্ত ফাইল / ফোল্ডার মুছুন, কারণ তারা 'অবিরত না থাকায় এবং বিভ্রান্তির কারণ হতে পারে।

মেশিন 2 এ যদি আপনার কাজটি কেবলমাত্র এক সময়ের জিনিস ছিল এবং আপনার সেখানে বিকাশ চালিয়ে যাওয়ার দরকার নেই ... তবে খালি রেপো তৈরি করে বিরক্ত করবেন না; কেবল ftp / rsync / scp / ইত্যাদি। আপনার ফাইলগুলি মেশিন * 2 * থেকে মেশিনের উপরে ফাইলগুলি * 1 *, মেশিন * 1 * থেকে প্রতিশ্রুতিবদ্ধ / চাপ দিন এবং তারপরে ফাইলগুলি মেশিনের বাইরে * 2 * মুছুন। অন্যরা একটি শাখা তৈরি করার পরামর্শ দিয়েছে, তবে আমি মনে করি এটি যদি আপনি অন্য মেশিনের থেকে এক সময়ের ভিত্তিতে কিছুটা উন্নয়ন ঘটাতে চান তবে এটি কিছুটা অগোছালো।

আপনার যদি মেশিন 1 এবং মেশিন 2 উভয়ই বিকাশ চালিয়ে নেওয়া দরকার ... তবে আপনার জিনিসগুলি সঠিকভাবে সেট আপ করা দরকার। আপনার রেপোটিকে খালি রূপান্তর করতে হবে , তারপরে আপনাকে কাজ করার জন্য আপনাকে মেশিন 1 এ তার একটি ক্লোন তৈরি করতে হবে । সম্ভবত এটি করার দ্রুততম উপায়টি এটি করা

machine1:~/proj1> git config --bool core.bare true
machine1:~/proj1> mv .git/ ../proj1.git
machine1:~/proj1> cd ..
machine1:~> rm -rf proj1
machine1:~> git clone proj1.git
machine1:~> cd proj1

খুব গুরুত্বপূর্ণ: কারণ আপনি রেপোর অবস্থানটি প্রোজ 1 থেকে প্রজ 1.git এ সরিয়ে নিয়েছেন, আপনাকে এটি মেশিন 2 এ .git / কনফিগারেশন ফাইলে আপডেট করতে হবে । এর পরে, আপনি মেশিন 2 থেকে আপনার পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ করতে পারেন। সবশেষে, আমি আমার খালি রেপোগুলিকে আমার কার্য গাছ থেকে দূরে কেন্দ্রীয় অবস্থানে রাখার চেষ্টা করি (যেমন 'প্রজ 1' হিসাবে একই প্যারেন্ট ফোল্ডারে রাখি না)। আমি আপনাকে অনুরূপভাবে করার পরামর্শ দিচ্ছি, তবে আমি উপরের ধাপগুলি যথাসম্ভব সহজ করে রাখতে চেয়েছিলাম।


খুব বিস্তারিত এবং সহায়ক। আমার কেসটি সর্বশেষ ছিল এবং আপনার নির্দেশাবলী মোহন মত কাজ করেছিল।
pojda

আমি কেস 3 এ আছি এবং আমি কিছুটা আলাদা করেছি: এমকে গিট-সার্ভার; mv .git git-server / proj.git এবং তারপরে git ক্লোন গিট-সার্ভার / proj.git 1 এবং 2 উভয় (বা গিট দূরবর্তী উত্স ...) ব্যবহার করুন, মেশিন 2 এর জন্য একটি উপযুক্ত ssh: // উপসর্গ ব্যবহার করে This আমি একটি খালি মাস্টার কপি রাখব যা জিএইচ বা অন্যান্য এইচটিটিপি সার্ভারে সাধারণত একটির মতো হবে এবং আমি উভয়ই মেশিনে পুশ / টান ব্যবহার করতে থাকব।
জাকম্যাক

18

কয়েকটি সেটআপ পদক্ষেপের সাহায্যে আপনি ওয়ান-লাইনারের মতো ব্যবহার করে সহজেই আপনার ওয়েবসাইটে পরিবর্তন স্থাপন করতে পারেন

git push production

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

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

mkdir mywebsite.git
cd mywebsite.git
git init --bare

তারপরে ফাইলটি তৈরি করুন hooks/post-receive:

#!/bin/sh
GIT_WORK_TREE=/path/to/webroot/of/mywebsite git checkout -f

এবং ফাইলটি কার্যকর করতে সক্ষম করুন:

chmod +x hooks/post-receive

আপনার স্থানীয় মেশিনে,

git remote add production git@myserver.com:mywebsite.git
git push production +master:refs/heads/master

সব সেট! ভবিষ্যতে এখন আপনি git push productionআপনার পরিবর্তনগুলি মোতায়েন করতে ব্যবহার করতে পারেন !

এই সমাধানের জন্য ক্রেডিট http://sebduggan.com/blog/deploy-your-website-changes-used-git/ এ যায় । কী চলছে তার আরও বিশদ ব্যাখ্যার জন্য সেখানে দেখুন।


আপনার প্রস্তাবনা আমাকে অনেক সাহায্য করেছে, কিন্তু আমি ব্যবহার করেননি bare, আমি অনুসরণ এই সঙ্গে এবং একত্রীকরণ hooks(যে আপনার প্রস্তাবিত) এবং পুরোপুরি কাজ করেন।
অ্যাডারসন টি। স্ল্যাচটা

11

আপনি কেবল একটি খালি সংগ্রহস্থলের দিকে ঠেলা উচিত। খালি সংগ্রহস্থল হ'ল এমন একটি সংগ্রহশালা যার কোনও পরীক্ষা করা শাখা নেই। আপনি যদি একটি খালি সংগ্রহস্থল ডিরেক্টরিতে সিডি করতেন তবে আপনি কেবল একটি .git ডিরেক্টরিতে থাকা সামগ্রীটি দেখতে পাবেন।


9
নন-বেয়ার স্টোরগুলিতে একটি চেক করা না হওয়া শাখায় ঠেলাতে কোনও ভুল নেই। এটি কাজ করার উপযুক্ত উপায়।
সিবি বেইলি

যথেষ্ট ভাল, যে কাজ করবে। কিন্তু ব্যবহারকারী এটি করছেন না।
রিবল্ড এডি

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

10

আপনার কাছে 3 টি বিকল্প রয়েছে

  1. আবার টানুন এবং চাপুন:

    git pull; git push
    
  2. বিভিন্ন শাখায় পুশ করুন:

    git push origin master:foo
    

    এবং এটিকে দূরবর্তীতে মার্জ করুন (হয় gitবা টেনে-অনুরোধের মাধ্যমে )

    git merge foo
    
  3. এটি জোর করে (আপনি ইচ্ছাকৃতভাবে এর মাধ্যমে কমিটগুলি পরিবর্তন না করলে প্রস্তাবিত নয় rebase):

    git push origin master -f
    

    তবুও যদি অস্বীকার করা denyCurrentBranch হয় তবে দূরবর্তী সংগ্রহস্থলটিতে অক্ষম করুন :

    git config receive.denyCurrentBranch ignore
    

বিকল্প 2 আমার জন্য কাজ। রিমোট গিট থ্রি লোকাল গিট পুশ অরিজিন মাস্টার: ব্রাঞ্চ রিমোট গিট মার্জ ডোন
জ্যাকি চং

7

প্রকৃতপক্ষে, রিমোটটিকে একটি চেক না করা শাখায় সেট করা যথেষ্ট। আপনি অন্য একটি শাখায় আপনার রিমোটটি পরীক্ষা করে নেওয়ার পরে, আপনি চাপ দিতে পারেন।


7

.git/configগন্তব্য প্রকল্পে আপনার পরীক্ষা করুন :

$ cat .git/config 
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[receive]
    denyCurrentBranch = updateInstead

যদি core. bareমিথ্যাটি মিথ্যা হয় তবে আপনি এটি সত্যতে সেট করতে পারেন:

$ git config core.bare true

এবং তারপরে রিমোটে আপনার স্থানীয় ধাক্কায়:

git push remote_repo   // suppose the destination repo is remote_repo

এটি সফলতা পাবে, রিমোট_রেপোতে আপনি গিট সংস্করণ চেক করতে পারেন।

$ git log -1
commit 0623b1b900ef7331b9184722a5381bbdd2d935ba
Author: aircraft < aircraft_xxx@126.com>
Date:   Thu May 17 21:54:37 2018 +0800

এবং এখন আপনি আপনার "কর্মক্ষেত্র" এ গিট ব্যবহার করতে পারবেন না:

$ git status
fatal: This operation must be run in a work tree

আপনি bare.bareমিথ্যা ফিরে সেট করা উচিত ।

$ git config core.bare false

5

আমার অ্যান্ড্রয়েড ফোন এবং ল্যাপটপে রিপোজিটারিগুলি সিঙ্ক্রোনাইজ করতে গিট ব্যবহার করে আমার একই সমস্যা হয়েছিল। আমার পক্ষে সমাধানটি ছিল চাপের পরিবর্তে একটি টান করা, যেমন @ চারেলস বেইলি পরামর্শ দিয়েছে।

git push origin master অ্যান্ড্রয়েড সংগ্রহস্থলটিতে আমার জন্য একই ত্রুটি বার্তাগুলি ব্যর্থ হয় যা @ হ্যাপ 497 একটি সংগ্রহস্থল + ওয়ার্কিং-অনুলিপিটির ননবয়ার চেকআউটটিতে চাপ দেওয়ার কারণে পেয়েছিল।

git pull droid masterল্যাপটপের সংগ্রহস্থল এবং ওয়ার্কিং-কপি আমার জন্য কাজ করে। অবশ্যই, আপনার আগে এমন কিছু চালানো দরকার git remote add droid /media/KINGSTON4GB/notes_repo/


4

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

দেখা যাচ্ছে এটি মঞ্জুরি দেওয়ার জন্য ভয়াবহ বিভ্রান্তিকর জিনিস। সুতরাং তারা যে সতর্কতা বার্তাটি দেখেছে তা জুড়েছে, এটি অত্যন্ত মারাত্মক বিভ্রান্তিকর is

যদি প্রথম সংগ্রহস্থলটি কেবলমাত্র একটি সার্ভার হিসাবে কাজ করে থাকে তবে অন্যান্য উত্তরগুলির পরামর্শ অনুসারে এটিকে একটি খালি সংগ্রহস্থলে রূপান্তর করুন এবং এটি সম্পন্ন করুন।

তবে আপনার যদি দুটি রেপোর মধ্যে একটি অংশীদারি শাখা থাকা দরকার যা উভয়ই ব্যবহৃত হয় তবে আপনি নিম্নলিখিত সেটআপ দিয়ে এটি অর্জন করতে পারেন

Repo1 - সার্ভার হিসাবে কাজ করবে এবং উন্নয়নের জন্যও ব্যবহৃত হবে

Repo2 - শুধুমাত্র উন্নয়নের জন্য হবে

নীচে Repo1 সেটআপ করুন

কাজ ভাগ করে নেওয়ার জন্য একটি শাখা তৈরি করুন।

git branch shared_branch

নিরাপদ থাকতে, আপনার এমন একটি create (আরইপিও) তৈরি করা উচিত যা shared (গি / হুকস / আপডেট) ভাগ করে নেওয়া ব্রাঞ্চ ব্যতীত অন্য যে কোনও পরিবর্তনের বিষয়টি প্রত্যাখ্যান করে, কারণ আপনি চান না যে লোকেরা আপনার ব্যক্তিগত শাখাগুলির সাথে কৌতুক করছে।

repo1/.git/hooks  (GIT_DIR!)$ cat update
#!/bin/sh
refname="$1"
oldrev="$2"
newrev="$3"

if [ "${refname}" != "refs/heads/shared_branch" ]
then
   echo "You can only push changes to shared_branch, you cannot push to ${refname}"
   exit 1
fi

এখন রেপো 1 এ একটি স্থানীয় শাখা তৈরি করুন যেখানে আপনি আপনার আসল কাজ করবেন।

git checkout -b my_work --track shared_branch
Branch my_work set up to track local branch shared_branch.
Switched to a new branch 'my_work'

( কাজ git config --global push.default upstreamকরার জন্য প্রয়োজন হতে পারে git push)

এখন আপনি এটি দিয়ে repo2 তৈরি করতে পারেন

git clone path/to/repo1 repo2 
git checkout shared_branch 

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


3

ঠিক আছে, আপনি যদি একটি সাধারণ দূরবর্তী সংগ্রহস্থল চান তবে একটি অতিরিক্ত শাখা তৈরি করুন এবং এটি পরীক্ষা করে দেখুন check এটিকে একটি শাখায় ঠেলাও (যা চেক আউট হয় না) এবং স্থানীয়ভাবে চাপ দেওয়ার পরে এটি বর্তমানে সক্রিয় থাকা একটিতে এটি মার্জ করুন।

উদাহরণস্বরূপ, একটি রিমোট সার্ভারে:

git branch dev
git checkout dev

স্থানীয় সেটআপে:

git push 

রিমোট সার্ভারে:

git merge dev

2

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

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

আরম্ভ

আপনার স্থানীয় কম্পিউটার এবং cdএটিতে কিছু ডিরেক্টরি তৈরি করুন , তারপরে এই আদেশগুলি কার্যকর করুন:

# initialization
git init --bare server/.git
git clone server content
git clone server local
  1. প্রথমে আপনি একটি খালি serverডিরেক্টরি তৈরি করুন (শেষে .git লক্ষ্য করুন)। এই ডিরেক্টরিটি কেবলমাত্র আপনার সংগ্রহস্থলগুলির ফাইলের জন্য ধারক হিসাবে কাজ করবে।
  2. তারপরে একটি নতুন তৈরি contentডিরেক্টরিতে আপনার সার্ভারের সংগ্রহস্থলটিকে ক্লোন করুন । এটি আপনার লাইভ / উত্পাদন ডিরেক্টরি যা আপনার সার্ভার সফ্টওয়্যার দ্বারা পরিবেশন করা হবে।
  3. প্রথম দুটি ডিরেক্টরি আপনার সার্ভারে থাকে, তৃতীয়টি হল আপনার ওয়ার্কস্টেশনের স্থানীয় ডিরেক্টরি।

কর্মধারা

এখন এখানে মূল কর্মপ্রবাহ:

  1. localডিরেক্টরি লিখুন , কিছু ফাইল তৈরি করুন এবং তাদের প্রতিশ্রুতিবদ্ধ। শেষ পর্যন্ত এগুলি সার্ভারে চাপ দিন:

    # create crazy stuff
    git commit -av
    git push origin master
    
  2. এখন contentডিরেক্টরি লিখুন এবং সার্ভারের সামগ্রী আপডেট করুন:

    git pull
    
  3. 1-2 পুনরাবৃত্তি। এখানে contentঅন্য বিকাশকারী হতে পারে যা সার্ভারেও চাপ দিতে পারে এবং localআপনি তাঁর কাছ থেকে টানতে পারেন।


2

এটি প্রত্যন্ত উজানের শাখায় ঠেলাতে এটি ব্যবহার করে আমার জন্য এই সমস্যাটি সমাধান করেছে:

git push <remote> master:origin/master

রিমোটটির উজানের রেপোতে কোনও অ্যাক্সেস ছিল না তাই এই রিমোটটিতে সর্বশেষ পরিবর্তনগুলি পাওয়ার ভাল উপায় ছিল


1
আরো সাধারণভাবে (এই কমান্ডের নেট প্রভাব), ব্যবহার git push <remote> master:newbranch। ধারণাটি হ'ল আপনি রিমোটে একটি নতুন শাখা চাপুন, যা পরে একত্রীকরণ করা যায় This এইভাবে আপনি ত্রুটির বার্তায় উল্লিখিত কোনও অসঙ্গতি সমস্যা এড়াতে পারবেন।
ক্লে

1

আমাকে git --initএকটি বিদ্যমান খালি সংগ্রহস্থল পুনরায় চালাতে হয়েছিল, এবং .gitএটি খালি সংগ্রহস্থল গাছের ভিতরে একটি ডিরেক্টরি তৈরি করেছিল - আমি বুঝতে পারি যে git statusসেখানে টাইপ করার পরে । আমি এটি মুছলাম এবং আবার সবকিছু ঠিক হয়ে গেল :)

(এই সমস্ত উত্তর দুর্দান্ত, তবে আমার ক্ষেত্রে এটি সম্পূর্ণ আলাদা কিছু ছিল (যতদূর আমি দেখতে পাচ্ছি), বর্ণিত।)


1

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

বর্ণিত ত্রুটির মুখোমুখি হওয়ার সময় আমার একটি Elpipse + EGit ওয়েব প্রকল্প সেটআপ ছিল। আমাকে কী সাহায্য করেছিল কেবলমাত্র গিটহাব অ্যাপ্লিকেশনটি ব্যবহার করা, যা দেখে মনে হচ্ছে যাদুটি সমস্যার সমাধান করেছে। যদিও ইজিট সর্বদা ধাক্কা অস্বীকার করবে, গিটহাব ডেস্কটপ অ্যাপ্লিকেশনটি কেবল তার কাঁধ সরিয়ে আমার পরিবর্তনগুলিকে ধাক্কা দেবে। হতে পারে এটি মাল্টি-লগইন-পরিস্থিতি আরও করুণভাবে পরিচালনা করে।


1

আমি নিবন্ধটি পেয়েছি যা অন্যের পক্ষে কার্যকর হতে পারে 5 মিনিটের মধ্যে গিট

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

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

দূরবর্তী সংগ্রহস্থল খালি করার জন্য এখানে পরামর্শগুলি। আমার প্রয়োজনীয়তার জন্য আরও ভাল ছিল এক্সকোড প্রকল্পটির ক্লোন করা projectname.git, এটি অনুলিপি সার্ভারে অনুলিপি করুন; তারপরে জাদুকরীভাবে কাজ করে p পরবর্তী পদক্ষেপটি কমিট সম্পর্কে কোনও ত্রুটি ছাড়াই ধাক্কা দেওয়ার জন্য এক্সকোড পাবে, তবে আপাতত আমি টার্মিনাল থেকে ঠিক করছি।

তাই:

cd /tmp (or another other directory on your system)<br/>
git clone --bare /xcode-project-directory projectname.git<br/>
scp -r projectname.git sshusername@remotehost.com:repos/<br/>

আপনি এক্সকোডে প্রতিশ্রুতিবদ্ধ হওয়ার পরে আপনার এক্সকোড প্রকল্প থেকে পরিবর্তনগুলি ঠেলে দিতে:

cd /xcode-project-directory<br/>
git push sshusername@remotehost.com:repos/projectname.git<br/>

আমি নিশ্চিত যে উপরেরগুলি করার একটি মসৃণ আরও পরিশীলিত উপায় আছে তবে সর্বনিম্ন এটি কাজ করে। ঠিক তাই সমস্ত কিছু পরিষ্কার, এখানে কিছু স্পষ্টতা রয়েছে: /xcode-project-directoryআপনার এক্সকোড প্রকল্পটি যে ডিরেক্টরিতে সঞ্চিত আছে এটি সম্ভবত /Users/Your_Name/Documents/Project_Name। প্রকল্পের নামটি আক্ষরিক অর্থে প্রকল্পের নাম তবে এটির জন্য এটি আপনার যত্ন নেওয়া কোনও কিছুই হতে পারে। গিট যত্ন করে না, তুমি করবে।

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

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


1

এটি করার সর্বোত্তম উপায় হ'ল:

mkdir ..../remote
cd ..../remote
git clone --bare .../currentrepo/

এটি সংগ্রহস্থলের ক্লোন করবে, তবে এটি কোনও কার্যকরী অনুলিপি তৈরি করে না .../remote। আপনি যদি রিমোটটির দিকে লক্ষ্য করেন তবে আপনি একটি ডিরেক্টরি তৈরি করেছেন currentrepo.gitযা বলা হয়ে থাকে যা সম্ভবত আপনি চান।

তারপরে আপনার স্থানীয় গিট সংগ্রহস্থল থেকে:

git remote add remoterepo ..../remote/currentrepo.git

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

git push remoterepo master

1

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

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

আপনার সহযোগিতার জন্য হিরোকুর অনুলিপিটি আপনার একমাত্র গিট সংগ্রহস্থল হিসাবে ব্যবহার করা উচিত নয়, তবে কেবলমাত্র আমি স্পষ্টভাবেই বলব: যদি না আপনি নিশ্চিত হন যে আপনার সংগ্রহস্থলটির একটি সম্পূর্ণ অনুলিপি সুরক্ষিতভাবে অন্য কোথাও সঞ্চিত আছে তবে আপনি এটি করবেন না unless Heroku। পুনরায় সেট করার ফলে ভান্ডার সামগ্রীগুলি মুছে যাবে।

পুনঃ স্থাপন করতে:

  1. হিরোকু টুলবেল্টটি ইনস্টল করুন (এতে কমান্ড লাইন ক্লায়েন্ট রয়েছে) যদি আপনার ইতিমধ্যে না থাকে।
  2. আপনার যদি ইতিমধ্যে না থাকে তবে হিরকু-রেপো প্লাগইন ইনস্টল করুন ।

    heroku plugins:install https://github.com/heroku/heroku-repo.git
    
  3. পুনরায় সেট করুন, যা ভাণ্ডার মুছে দেয় এবং একটি নতুন, খালি তৈরি করে

    heroku repo:reset
    
  4. আপনার হেরোকু রিমোটে সাধারণভাবে যেমন ধাক্কা দিন; এটি সবকিছু পুনরায় আপলোড করবে।


এটি কাজ করার জন্য আপনাকে হিরোকু রেপো সরঞ্জামগুলি ইনস্টল করতে হবে। করুনheroku plugins:install https://github.com/heroku/heroku-repo.git
নূহ

1

একবার খালি (খালি) সংগ্রহস্থান তৈরি করার পরে আপনাকে রিমোট সার্ভারে কনফিগার ফাইলটি পরিবর্তন করতে হবে, বলুন

root@development:/home/git/repository/my-project# cat config 

সেখানে আপনি দেখতে পাবেন

[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true

আপনি এটিকে খালি থেকে মিথ্যা করে তুলবেন এবং আমি লগলরেফুপেটস = সত্য (এটির ব্যবহার সম্পর্কে নিশ্চিত নই!) সরিয়েছি

প্রতি

[core]
repositoryformatversion = 0
filemode = true
bare = true

আপনি নিম্নলিখিত পরীক্ষা করতে পারেন

$ git remote show origin
* remote origin
Fetch URL: my-portal@development:/home/XYZ/repository/XYZ
Push  URL: my-portal@development:/home/XYZ/repository/XYZ
HEAD branch: (unknown)

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

git remote show origin

এবং আপনি দেখতে পাবেন

 HEAD branch: master

0

আমার জন্য কাজ করার সমাধানটি হ'ল:

রিমোটে:

git checkout -b some_tmp_name

স্থানীয়:

git push

রিমোটে:

git checkout master
git branch -d some_tmp_name

তবে এটি আসল সমাধান নয় এটি কেবলমাত্র কর্মচঞ্চল।


আপনার কাছে কেন্দ্রীয় সংগ্রহস্থল না থাকলে এটি একটি বৈধ সমাধান।
রিক

0

সেক্ষেত্রে কারও কাছে এটি দরকারী মনে হয়। আমার জন্য এটি গিট সার্ভারের অনুমতি সংক্রান্ত সমস্যা ছিল। আমি ভিক্ষা থেকে প্রকল্পটি পরীক্ষা করে দেখেছিলাম এবং একটি সাধারণ ফাইলটি ধাক্কা দিয়েছিলাম এবং তারপরে আমি "পুশ প্রত্যাখ্যান করে: পুশ টু আদি / মাস্টার প্রত্যাখ্যাত হয়েছিল"


-1

গিটের সাথে, দুটি নিয়মিত (নন-বেয়ার) সংগ্রহস্থল সরাসরি এবং পিছনে ফাইলগুলি ধাক্কা / টানতে পারে না। একটি মধ্যস্থতাকারীর খালি সংগ্রহস্থল থাকতে হবে। স্পষ্টতই, এটি এক ধরণের বিবাহিত দম্পতির মতো বাচ্চা হয় এবং এই দম্পতির বিবাহ বিচ্ছেদ ঘটে। বাবা-মা একে অপরের সাথে কথা বলবে না, তবে তারা ছাগলের মাধ্যমে যোগাযোগ করবে।

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

সুতরাং, এখানে একটি উদাহরণ:

পিসিতে, ~ / ওয়ার্কস্পেসে

git init
echo "line 1" > afile.txt
git add .
git commit -m ‘initial import’
git clone --bare . ../remote-repository.git
git remote add origin ../remote-repository.git
git push --set-upstream origin master

ল্যাপটপে, ~ / ওয়ার্কস্পেসে (গিট থ্রি, ইত্যাদি করবেন না)

git clone //LJZ-DELLPC/remote-repository.git/ .

// তারপরে বিভিন্ন কমিট করুন এবং তাদেরকে চাপ দিন:

echo "line 2" > afile.txt
git add afile.txt
git commit -m 'added line 2'
git push    

তারপরে পিসিতে ফিরে ~ / ওয়ার্কস্পেসে

git pull

// তারপরে বিভিন্ন কমিট করুন এবং তাদেরকে চাপ দিন:

git push

ল্যাপটপের গিট টানে

এবং তাই ..

কমান্ড উইন্ডো থেকে অনুলিপি করে একটি মেশিনে সমস্তরকমের এক নিখুঁত উদাহরণ এখানে দেওয়া হয়েছে, যাতে আমরা জানতে পারি যে কোনও পদক্ষেপই বাকী ছিল না, এটি সত্যই কাজ করেছে ইত্যাদি:

lylez@LJZ-DELLPC ~
$ cd gitdir
/home/lylez/gitdir

lylez@LJZ-DELLPC ~/gitdir
$ ls

lylez@LJZ-DELLPC ~/gitdir
$ mkdir repo1

lylez@LJZ-DELLPC ~/gitdir
$ cd repo1
/home/lylez/gitdir/repo1

lylez@LJZ-DELLPC ~/gitdir/repo1
$ git init
Initialized empty Git repository in /home/lylez/gitdir/repo1/.git/

lylez@LJZ-DELLPC ~/gitdir/repo1
$ echo "line 1" > afile.txt

lylez@LJZ-DELLPC ~/gitdir/repo1
$ git add afile.txt

lylez@LJZ-DELLPC ~/gitdir/repo1
$ git commit -m 'initial import'
[master (root-commit) f407e12] initial import
 1 file changed, 1 insertion(+)
 create mode 100644 afile.txt

lylez@LJZ-DELLPC ~/gitdir/repo1
$ git clone --bar . ../repo1-bare-clone
Cloning into bare repository '../repo1-bare-clone'...
done.

lylez@LJZ-DELLPC ~/gitdir/repo1
$ git remote add origin ../repo1-bare-clone

lylez@LJZ-DELLPC ~/gitdir/repo1
$ git push --set-upstream origin master
Branch master set up to track remote branch master from origin.
Everything up-to-date

lylez@LJZ-DELLPC ~/gitdir/repo1
$ cd ..

lylez@LJZ-DELLPC ~/gitdir
$ ls
repo1  repo1-bare-clone

lylez@LJZ-DELLPC ~/gitdir
$ mkdir repo1-remote

lylez@LJZ-DELLPC ~/gitdir
$ cd repo1-remote
/home/lylez/gitdir/repo1-remote

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ git clone ../repo1-bare-clone .
Cloning into '.'...
done.

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ ls
afile.txt

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ cat afile.txt
line 1

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ echo "line 2" >> afile.txt

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ git add afile.txt

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ git commit -m 'added line 2'
[master 5ad31e0] added line 2
 1 file changed, 1 insertion(+)

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ git push
Counting objects: 3, done.
Writing objects: 100% (3/3), 260 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /home/lylez/gitdir/repo1-remote/../repo1-bare-clone
   f407e12..5ad31e0  master -> master

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ cd ../repo1

lylez@LJZ-DELLPC ~/gitdir/repo1
$ ls
afile.txt

lylez@LJZ-DELLPC ~/gitdir/repo1
$ cat afile.txt
line 1

lylez@LJZ-DELLPC ~/gitdir/repo1
$ git pull
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From ../repo1-bare-clone
   f407e12..5ad31e0  master     -> origin/master
Updating f407e12..5ad31e0
Fast-forward
 afile.txt | 1 +
 1 file changed, 1 insertion(+)

lylez@LJZ-DELLPC ~/gitdir/repo1
$ cat afile.txt
line 1
line 2

lylez@LJZ-DELLPC ~/gitdir/repo1
$ echo "line 3" >> afile.txt

lylez@LJZ-DELLPC ~/gitdir/repo1
$ git add afile.txt

lylez@LJZ-DELLPC ~/gitdir/repo1
$ git commit -m 'added line 3'
[master 3fa569e] added line 3
 1 file changed, 1 insertion(+)

lylez@LJZ-DELLPC ~/gitdir/repo1
$ git push
Counting objects: 3, done.
Writing objects: 100% (3/3), 265 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To ../repo1-bare-clone
   5ad31e0..3fa569e  master -> master

lylez@LJZ-DELLPC ~/gitdir/repo1
$ cd ../repo1-remote/

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ ls
afile.txt

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ cat afile.txt
line 1
line 2

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ git pull
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /home/lylez/gitdir/repo1-remote/../repo1-bare-clone
   5ad31e0..3fa569e  master     -> origin/master
Updating 5ad31e0..3fa569e
Fast-forward
 afile.txt | 1 +
 1 file changed, 1 insertion(+)

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ cat afile.txt
line 1
line 2
line 3

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ git --version
git version 2.1.1

lylez@LJZ-DELLPC ~/gitdir/repo1-remote

এটি কী কাজ করে তার একটি উদাহরণ এবং কেন এর ব্যাখ্যা। আপনার মন্তব্য ব্যতীত এখানে কোনও ভুল তথ্য নেই।
লাইল জেড

1
"গিটের সাথে, দুটি নিয়মিত (নন-বেয়ার) রিপোজিটরিগুলি ফাইলগুলি সরাসরি এবং সামনে টানতে / টানতে পারে না" - তারা না পারলে।
অ্যান্ড্রু সি

ভাল, আক্রমণ পরিবর্তে একটি কংক্রিট উদাহরণ পোস্ট করুন।
লাইল জেড

অথবা আপনি এটি গুগল করতে পারেন? stackoverflow.com/questions/1764380/…
অ্যান্ড্রু সি

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

-3

আমার সমাধান (ব্যবহারে)

  1. রিমোট সার্ভারে "মাস্টার" চেকআউট করুন
  2. "দেব" শাখায় স্থানীয়ভাবে কাজ করুন
  3. রিমোট ডেভ এ পরিবর্তন ঠেলাও
  4. রিমোটে দেবকে মার্জ করুন

লোটোখেলা

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