গিট পুশ ত্রুটি: চেক আউট শাখাটি আপডেট করতে অস্বীকার করছে


196

আমি কিছু সংহত দ্বন্দ্ব সমাধান করেছি, প্রতিশ্রুতিবদ্ধ হয়ে আমার পরিবর্তনগুলি ঠেলে দেওয়ার চেষ্টা করেছি এবং নিম্নলিখিত ত্রুটিটি পেয়েছি:

c:\Program Files (x86)\Git\bin\git.exe push --recurse-submodules=check "origin" master:master
Done
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error: 
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error: 
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To C:/Development/GIT_Repo/Project
 ! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'C:/Development/GIT_Repo/Project'

কেউ কি জানেন যে এই ত্রুটির কারণ হতে পারে?



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

উত্তর:


229

কারণ: আপনি একটি নন-বেয়ার স্টোরের দিকে চাপ দিচ্ছেন

দুটি ধরণের সংগ্রহস্থল রয়েছে: খালি এবং নন-বেয়ার

বেয়ার স্টোরগুলির একটি কার্যকরী অনুলিপি নেই এবং আপনি সেগুলিতে চাপ দিতে পারেন। এগুলি হ'ল গিথুব এ আপনি যে ধরণের সংগ্রহস্থল পান! আপনি যদি একটি খালি সংগ্রহস্থান তৈরি করতে চান তবে আপনি এটি ব্যবহার করতে পারেন

git init --bare

সুতরাং, সংক্ষেপে, আপনি একটি নন-বেয়ার স্টোরগুলিতে চাপ দিতে পারবেন না(সম্পাদনা করুন: ভাল, আপনি বর্তমানে কোনও সংগ্রহস্থলের চেক আউট শাখায় ঠেলাঠেলি করতে পারবেন না rep । আপনি যা করতে পারেন তা হ'ল অন্য সংগ্রহস্থল থেকে আনতে এবং একত্রীকরণ। এই হল কিভাবে pull requestআপনি গিটহাব কাজ দেখতে পারেন। আপনি তাদের আপনার কাছ থেকে টানতে বলুন এবং আপনি এগুলিতে জোর করে চাপ দিন না।


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


1
হ্যাঁ! এটি সঠিক, আপনাকে ধন্যবাদ! আমার প্রায় দশ লক্ষ কাজ করার মতো, আমি ঘটনাক্রমে ওয়ার্কিং ডিরেক্টরিটি ক্লোন করেছি .... দোহ!
মজাদার

25
প্রকৃতপক্ষে, আপনি একটি খালি নন স্টোরের দিকে ঠেলাঠেলি করতে পারেন, আপনি বর্তমানে যে শাখাগুলি যাচাই করেছেন তা কেবল ধাক্কা দিতে পারবেন না ।
কোথাও কোনও মানুষ

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

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

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

115

আমি প্রথমে যাচাই করেছিলাম যে দূরবর্তীটিতে চেক আউট কিছু নেই (যা সত্যই বলা উচিত ছিল না) যাচাই করে এই সমস্যার সমাধান করেছি এবং তারপরে এটি খালি করে তুলেছি:

$ git config --bool core.bare true

এর পরে গিট পুশ ঠিকঠাক কাজ করেছিল।


3
এটি আমি ওয়ান লাইনারের জন্য সন্ধান করছিলাম .. তবে @ শাহবাজ উত্তরের মতো খালি নন-বেয়ার রেপোস ব্যাখ্যা করতে পারেন
Mr5o1

এটি পরিবর্তনের ইতিহাসকে ধাক্কা দেবে, তবে এই পরিবর্তনগুলি নন-বেয়ার রেপোতে প্রতিফলিত হবে না।
jhill515

আপনি git config core.bare falseএবং git reset --hard ?
বিমান

1
উপরে উল্লিখিত হিসাবে আপনি যখন এটির দিকে এগিয়ে যান তখন রিমোটটি পরিবর্তন করা হবে না।
ব্যবহারকারী 1097111

46

সারসংক্ষেপ

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

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

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

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

সুতরাং

A ← B
    ↑
[HEAD,branch1]

হয়ে

A ← B ← C
        ↑
    [HEAD,branch1]

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

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

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

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

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



21

আপনি রিমোট মেশিনে প্রবেশ করছেন এমন রেপো / ডিরেক্টরিতে সিডি করুন এবং প্রবেশ করুন

$ git config core.bare true

এটা কাজ করে না. এটিতে চাপ দেওয়ার পরে ভান্ডারটি খালি থাকে।
সেরেন

উপরে jhil515 দ্বারা বলা হয়েছে, নন-বেয়ার ফাইলগুলি আপডেট হয় না, কেবল ডাটাবেসগুলি।
ডেনিস কজিনো

19

আমার জন্য, নিম্নলিখিতটি কৌশলটি করেছে:

git config --global receive.denyCurrentBranch updateInstead

গিট ব্যবহার করে আমার উইন্ডোজ 10 ডেস্কটপ এবং আমার উইন্ডোজ 10 ল্যাপটপের মধ্যে সিঙ্ক করতে আমি প্রায় সম্পূর্ণরূপে ড্রাইভ সেট আপ করেছি set আমি উভয় মেশিনে উপরের কমান্ডটি চালিয়ে শেষ করেছি।

প্রথমে আমি নেটওয়ার্কে ডেস্কটপের এফ ড্রাইভ ভাগ করে নিই। তারপরে আমি চালিয়ে এটি আমার ল্যাপটপে ক্লোন করতে সক্ষম হয়েছি:

F: git clone 'file://///DESKTOP-PC/f'

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

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

নোট করুন যে আমি উভয় মেশিনে উইন্ডোজ পাওয়ারশেলের মধ্যে থেকে এই সমস্ত কমান্ড চালিয়েছি।

আপডেট: আমি এখনও কিছু ক্ষেত্রে পরিবর্তন ঠেলাঠেলি সমস্যা ছিল। পরিবর্তে আমি পরিবর্তে কম্পিউটার পরিবর্তে টানতে শুরু করেছি, সর্বশেষ প্রতিশ্রুতি (গুলি) এ টানতে চাই:

git pull --all --prune


1
আমি এই স্থানীয় গিট রেপোতে পছন্দ করি:git config receive.denyCurrentBranch updateInstead
ক্লোর

14

যেহেতু ইতিমধ্যে একটি বিদ্যমান সংগ্রহস্থল রয়েছে, চলছে

git config --bool core.bare true

রিমোট রিপোজিটরিতে যথেষ্ট হওয়া উচিত

কোর.বেয়ার ডকুমেন্টেশন থেকে

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

সংগ্রহস্থলটি তৈরি করা হলে এই সেটিংটি স্বয়ংক্রিয়ভাবে গিট-ক্লোন বা গিট-থিম দ্বারা অনুমান করা যায়। ডিফল্টরূপে "/.git" এ শেষ হওয়া একটি সংগ্রহস্থল খালি নয় (খালি = মিথ্যা) বলে মনে করা হয়, অন্য সমস্ত সংগ্রহস্থল খালি (খালি = সত্য) বলে মনে করা হয়।


12

TLDR

  1. টানুন & আবার ধাক্কা: git pull &&& git push
  2. এখনও সমস্যা? বিভিন্ন শাখায় পুশ করুন: git push origin master:fooএবং এটিকে দূরবর্তী রেপোতে মার্জ করুন।
  3. বিকল্পভাবে যোগ করে চাপটি চাপ দিন -f( denyCurrentBranchউপেক্ষা করা দরকার)।

মূলত ত্রুটির অর্থ হল আপনার রিপোজিটরিটি রিমোট কোডের সাথে আপ-টু-ডেট নয় (এটির সূচক এবং কাজের গাছ আপনি যা ধাক্কা দিয়েছিলেন তার সাথে সামঞ্জস্যপূর্ণ নয়)।

সাধারণত আপনার pullপ্রথমে সাম্প্রতিক পরিবর্তনগুলি এবং pushএটি আবার পাওয়া উচিত।

যদি সহায়তা না করে, তবে বিভিন্ন শাখায় প্রবেশ করার চেষ্টা করুন, যেমন:

git push origin master:foo

তারপরে এই শাখাটি রিমোট রিপোজিটরিতে ফিরে মাস্টারের সাথে মার্জ করুন।

আপনি যদি কিছু অতীতের কমিটগুলি ইচ্ছাকৃতভাবে পরিবর্তন করে থাকেন git rebaseএবং আপনি আপনার পরিবর্তনগুলি দিয়ে রেপোকে ওভাররাইড করতে চান, আপনি সম্ভবত -f/ --forceপরামিতি যুক্ত করে চাপটি চাপিয়ে দিতে চান (যদি আপনি না করেন তবে প্রস্তাবিত নয় rebase)। যদি এখনও কাজ না করে তবে আপনাকে গিট বার্তার পরামর্শ অনুসারে রিমোটে সেট আপ receive.denyCurrentBranchকরতে ignoreহবে:

git config receive.denyCurrentBranch ignore

3

হতে পারে আপনার রিমোট রেপো সেই শাখায় রয়েছে যা আপনি চাপতে চান। আপনি আপনার দূরবর্তী মেশিনে অন্য একটি শাখা চেকআউট করার চেষ্টা করতে পারেন। এই ত্রুটিটি অদৃশ্য হয়ে যাওয়ার চেয়ে আমি এটি করেছি এবং আমি সাফল্যকে আমার দূরবর্তী রেপোতে ঠেলে দিয়েছি। লক্ষ্য করুন যে আমি github.com এর পরিবর্তে নিজের সার্ভারটি সংযোগ করতে ssh ব্যবহার করি।


1

আমার এই ত্রুটি রয়েছে কারণ গিট রেপো একই জায়গায় দু'বার (দুর্ঘটনাক্রমে) শুরু হয়েছিল: প্রথমে একটি নন-বেয়ার রেপো এবং শীঘ্রই খালি রেপো হিসাবে। .Git ফোল্ডারটি রয়ে গেছে বলে, গিট অনুমান করে যে সংগ্রহশালাটি নন-বেয়ার। .Git ফোল্ডারটি সরানো এবং কার্যকরী ডিরেক্টরি ডেটা সমস্যার সমাধান করে।


1
আমার পরিস্থিতিতে, এই ক্ষেত্রে ছিল। সরানো হচ্ছে .gitরিমোটের ফোল্ডারের আমাকে ধাক্কা প্রাথমিক কমিট অনুমোদিত।
টিম.রোহরার

0

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

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