গিট পুশ: রেফ / হেডস / আমার / সাব-ফ্র্যাঙ্ক বিদ্যমান, তৈরি করতে পারে না


88

সার্ভারের কোনও রেপোতে কী এই somme সাব-সাব-ফোল্ডার তৈরি করা সম্ভব নয়?

যদি আমি করি:

git push origin dev/master 

সব কাজ খুঁজে

তবে আমি যদি করি

git push origin dev/sub/master

আমি এটা বুজেছি:

error: 'refs/heads/dev/sub' exists; cannot create 'refs/heads/dev/sub/master'

আমি "গিট ব্রাঞ্চ-আর" এবং সরাসরি এসএসএস দিয়ে পরীক্ষা করেছি, ইতিমধ্যে কোনও ডিভ / সাব ফোল্ডার তৈরি হয়নি।

কোনো সমস্যা?


4
গিট এলএস-রিমোট উত্স কী ফিরে আসে?
ইক্কে

উত্তর:


157

এটা একটা নয় ফোল্ডারের যে বিদ্যমান, এটি একটি এর শাখা । (ঠিক আছে, কোথাও কোনও ফোল্ডার / ডিরেক্টরি জড়িত থাকতে পারে — বা নাও হতে পারে, কারণ তথ্যসূত্রগুলি "প্যাক" হয়ে যায় এবং ডিরেক্টরিগুলির মধ্যে ফাইল হিসাবে উপস্থিত থাকা বন্ধ করে দেয়))

  • যদি শাখা bবিদ্যমান থাকে তবে নামের কোন শাখা তৈরি করা b/anythingযাবে না।
  • তেমনিভাবে, যদি শাখা dev/bবিদ্যমান থাকে dev/b/cতবে তৈরি করা যায় না।

এটি গিটের অভ্যন্তরীণ সীমাবদ্ধতা। এই বিশেষ ক্ষেত্রে, রিমোটটির originএকটি শাখা রয়েছে dev/sub(আপনার এটি আছে বা না তা নির্বিশেষে গুরুত্বপূর্ণ বিষয়টি দূরবর্তীটিতে রয়েছে কিনা)। originনামের একটি শাখা তৈরি করতে, dev/sub/masterপ্রথমে আপনাকে অবশ্যই নামযুক্ত শাখাটি মুছতে dev/subহবে origin:

git push origin :dev/sub

(অবশ্যই, এই শাখা মোছার গুরুত্বপূর্ণ কিছু ওইখানে মুছে ফেলতে পারবেন, তাই নিশ্চিত আপনি জানেন আপনি কি করছেন হও। সাধারণত, আপনি তা করতে চাইবেন git fetch originপ্রথম, ক্যাপচার তাদের dev/subহিসাবে আপনার origin/dev/sub। এর পরে নামে একজন স্থানীয় শাখা করতে পারেন dev/renamed-subএকই কমিট নির্দেশিত , dev/renamed-subরিমোটে তৈরি করুন, রিমোটটি মুছুন dev/subএবং তারপরে dev/sub/masterরিমোটে তৈরি করুন))


আপনি যদি রিমোটে ( originহোস্ট করা সিস্টেমটিতে ) লগ ইন করতে পারেন তবে আপনি সেখান থেকে সংগ্রহস্থলটিতে যেতে পারেন এবং কেবল স্থানীয় dev/subশাখার নাম পরিবর্তন করতে পারেন । (নীচের মন্তব্যের উপর ভিত্তি করে, আমি সন্দেহ করি যে সেখানে একটি ভাঙা অটো-মোতায়েনের স্ক্রিপ্টও রয়েছে, যা সম্ভবত "চাপানো" শাখাগুলি স্থাপন করা উচিত, যা সবকিছু ধাক্কা দেয় না তার চেয়ে বেশি। তবে আমি এখানে অনুমান করছি)।


4
আমি অনুমান করি আমরা এখানে কেবলমাত্র পরিভাষা নিয়ে ঝগড়া করছি। "অভ্যন্তরীণ সীমাবদ্ধতা" দ্বারা আমি বোঝাচ্ছি যে কেউ গিট কীভাবে ব্যবহার করে তা পরিবর্তন না করেই গিট কিছুটা কাটিয়ে উঠতে পারে । একটি অযোগ্য সীমাবদ্ধতা অনেক বেশি মৌলিক কিছু হতে পারে, যেমন, কেউ যদি এসএএএ 1 ভাঙে: এমনকি এটিও পরাভূত হতে পারে (যেমন, SHA256 এ যান), 40-বর্ণের এসএইএ -1 এর বিবরণ উন্মুক্ত করা হয়েছে, যেমন, বেশিরভাগ হুক, সুতরাং এই সীমাবদ্ধতা বহিরাগত মধ্যে ফাঁস।
টেরিক

4
এটি একটি অদ্ভুতভাবে বিরক্তিকর সীমাবদ্ধতা দেওয়া হচ্ছে, আপনি release/1.1এবং & এর release/1.2সাথে থাকতে পারেন ইত্যাদি And তবে সহজ এবং স্পষ্ট ব্যাখ্যার জন্য আপনাকে ধন্যবাদ। release/1.1/hofix/prevent-upload-borkrelease/1.1/hotfix/assure-user-of-competence
বেঞ্জোহন

4
"এটি গিটের অভ্যন্তরীণ সীমাবদ্ধতা" " -- ঠিক আছে কিন্তু কেন? কিছু যুক্তি কি এভাবে বাস্তবায়ন করা সহজ ছিল? নাকি কিছু গাছ-গাছালি? অথবা কি?
ডি কোভ্যাকস

4
@ ডি.কোভ্যাক্স: এই ক্ষেত্রে নিষেধ করে, গিট কেবল ফাইলের মধ্যে রেফারেন্স হ্যাশ লিখতে পারে যার নামটি একটি নামের নাম হিসাবে ধরে রেফারেন্সকে বিবেচনা করে তৈরি করা হয়। গিট যদি উভয়কেই অনুমতি দেয় refs/tags/fooএবং refs/tags/foo/2উদাহরণস্বরূপ, এটি এটি করতে সক্ষম হবে না: এটির নিজস্ব কী-মান স্টোর প্রয়োগ করা দরকার। আমি মনে করি যে গিটকে যাইহোক তার নিজস্ব কী-ভ্যালু স্টোরটি প্রয়োগ করতে বাধ্য করা হবে, তবে আমি জানি না যে তারা তখন সীমাবদ্ধতাটি সরিয়ে ফেলবে কিনা।
টেরিক

4
@ আইনহুঁহু: আমি এই সীমাবদ্ধতা বর্ণনা করে কোনও আনুষ্ঠানিক ডকুমেন্টেশন জানি না। সাবমডিউলগুলি তবে সম্পূর্ণ পৃথক নাম-স্পেসে রয়েছে: শাখার নাম এবং ফাইলের নামগুলি যেভাবে সংঘর্ষে না হয় সেভাবে সাবমডিউলের নাম এবং শাখার নামগুলি সংঘটিত হওয়া উচিত নয় (অর্থাত্ সেগুলি হয়, তবে আপনি একটি বিশৃঙ্খলা যুক্ত করেন: git checkout -- masterঅর্থ পরীক্ষা করে দেখুন) ফাইল নামে masterবদলে শাখার নাম)।
2'18

62

আমি এমন অবস্থায় ছিলাম যখন আমি আনতেও পারি না কারণ আমার রেপোতে অ বিদ্যমান বিদ্যমান দূরবর্তী শাখাগুলির সম্পর্কে তথ্য ছিল আমি এমনকি পরীক্ষা করেও নিই। এর সমন্বয় (ধন্যবাদ @ টোরেক) চালিয়ে আমি এটিকে সমাধান করেছি:

  • git branch -r দূরবর্তী শাখাগুলির স্থানীয় অনুলিপিগুলি তালিকাভুক্ত করুন
  • git ls-remote দূরবর্তী শাখা তালিকা
  • git fetch --prune originদূরবর্তী শাখাগুলির স্থানীয় অনুলিপিগুলি আপডেট করুন ( এটি আসলে আমাকে সাহায্য করে না )
  • git remote prune originসরানো দূরবর্তী শাখাগুলি সম্পর্কে তথ্য সরান ( এটি হয়েছে )

8
git remote prune originএই ত্রুটি অবস্থার সমাধান করতে আমি যে একক কমান্ডটি চালিয়েছিলাম তা ছিল। বিভ্রান্তিকর বার্তা সত্যই - আমার ক্ষেত্রে আমি একটি "রিলিজ / ২..0.০" ধাক্কা দেওয়ার চেষ্টা করছিলাম এবং আমি পুরো 'রেফস / রিমোটস / উত্স / প্রকাশ *' দির error: update_ref failed for ref 'refs/remotes/origin/release/2.6.0': cannot lock ref 'refs/remotes/origin/release/2.6.0': 'refs/remotes/origin/release' exists; cannot create 'refs/remotes/origin/release/2.6.0'সরিয়ে দিয়েছি - তবুও আমি যখনই ধাক্কা / টান / আনার চেষ্টা করছিলাম তখন অভিযোগ
joiny

32

আমার জন্য ->

ত্রুটি =

fatal: cannot lock ref 'refs/heads/release/wl/2.3': 'refs/heads/release/wl' 
exists; cannot create 'refs/heads/release/wl/2.3'

সমাধান =

$~ git update-ref -d refs/heads/release/wl
$~ git checkout release/wl/2.3

4
গিট আপডেট-রেফ-ডি-রেফস / রিমোটেস ... আমার সমস্যাটিকে 'রেফ / রিমোটস / অরিজিন / হটফিক্স' উপস্থিত করে; 'রেফ / রিমোটস / উত্স / হটফিক্স / ইস্যু তৈরি করতে পারে না ...
এডুয়ার্ডো

এটি আমার সমস্যাও সমাধান করেছে।
মিখাইল মরফিকভ

16

বর্তমানে গৃহীত উত্তর আমাকে সাহায্য করা হয়নি কারণ আমি মুছে দিতে দূরবর্তী রেপো একটি সুত্র ছিল না - এটা আমার স্থানীয় উপর বিশুদ্ধরূপে ছিল! সুতরাং আপনি যদি এই পরিস্থিতিতে থাকেন তবে এখানে কী করতে হবে তা এখানে:

আমি এই সমস্যার মুখোমুখি হয়েছি:

$ git fetch origin
error: cannot lock ref 'refs/remotes/origin/fix/sub-branch': 
'refs/remotes/origin/fix' exists; cannot create 
'refs/remotes/origin/fix/sub-branch'
From <repo URL>
 ! [new branch]      fix/sub-branch          -> origin/fix/sub-branch
 (unable to update local ref)

আমি গৃহীত উত্তরের পরামর্শটি চেষ্টা করেছিলাম কিন্তু এটি পেয়েছি:

$ git push origin :fix
error: unable to delete 'fix': remote ref does not exist
error: failed to push some refs to <repo URL>

সুতরাং রেফ এমনকি অস্তিত্ব ছিল না origin- এটি পরিষ্কারভাবে আমার স্থানীয় রেপো কোথাও কোথাও ঝুলন্ত ছিল। সুতরাং আমি দৌড়েছি $ git remote show me, যা উত্পাদন করেছে:

Remote branches:
...
refs/remotes/origin/fix             stale (use 'git remote prune' to remove)
...

যার ফলে সমাধানটি পরিষ্কার হয়ে গেছে:

$ git remote prune origin
Pruning origin
URL: <redacted>
 * [pruned] origin/fix

এটির সাথে সমস্যাটি অদৃশ্য হয়ে গেল:

$ git fetch origin
remote: Counting objects: 5, done.
remote: Total 5 (delta 2), reused 2 (delta 2), pack-reused 3
Unpacking objects: 100% (5/5), done.
From <repo URL>
 * [new branch]      fix/sub-branch          -> origin/fix/sub-branch

4
হ্যাঁ, আপনি যেমন ছুটে এসেছিলেন git remote prune originঠিক একই সমস্যা । ধন্যবাদ!
টোডএইচ

3

এটি ঠিক করার জন্য এই আদেশটি চেষ্টা করুন:

git gc

বর্তমান সংগ্রহস্থলের মধ্যে বেশ কয়েকটি গৃহপালিত কাজ চালানো এবং অ্যাক্সেসযোগ্য অবজেক্টগুলি মুছে ফেলা (অনুরোধ করে git pruneএবং অনুরোধ করে git fsck --unreachable)।

আরও পড়ুন: git help gcএবংgit help prune


2

অন্য সমস্ত কিছু যদি ব্যর্থ হয় তবে আপনার রেপো সিস্টেমে শাখার নামগুলির সীমাবদ্ধতা নেই তা পরীক্ষা করে দেখুন। আমার ক্ষেত্রে, আপনি কেবল সেই শাখাগুলি তৈরি করতে পারেন যা দিয়ে শুরু হয় SD-<number>। অন্য কোনও নামকরণ আপনাকে কেবল একটি জেনেরিক দেবে:

remote: error: cannot lock ref 'refs/heads/mybranch': 'refs/heads/mybranch/environment-variables' exists; cannot create 'refs/heads/mybranch'
To git.example.com:project/repository.git
 ! [remote rejected] mybranch -> mybranch (failed to update ref)
error: failed to push some refs to 'git@git.example.com:project/repository.git'

1
#!/usr/bin/env bash
echo "update-ref delete refs/tags"
log="git-update-ref-errors.log"
script="./git-update-ref-exist-tags-delete.sh"
git_command="git update-ref -d refs/tags"

echo "log errors from ${git_command} to ${log}"
${git_command} 2>&1 | > ${log}
echo "show errors to ${log}"
cat ${log}
echo create ${script}
touch ${script}
echo "add execute (+x) permissions to ${script}"
chmod +x ${script}
echo "generate ${script} from errors log ${log}"
${git_command} 2>&1 | grep 'exists' | sed -n "s:.*\: 'refs/tags/\(.*\)' exists;.*:git tag -d '\1':p" >> ${script}
echo "execute ${script}"
${script}

echo fetch
log="git-fetch-errors.log"
script="./git-fetch-exist-tags-delete.sh"
git_command="git fetch"
echo "log errors from ${git_command} to ${log}"
${git_command} 2>&1 | > ${log}
echo "show errors from ${log}"
cat ${log}
echo create ${script}
touch ${script}
echo "add execute (+x) permissions to ${script}"
chmod +x ${script}
echo "generate ${script} from errors log ${log}"
${git_command} 2>&1 | grep 'exists' | sed -n "s:.*\: 'refs/tags/\(.*\)' exists;.*:git tag -d '\1':p" >> ${script}
echo "execute ${script}"
${script}
git fetch

echo pull
log="git-pull-errors.log"
script="./git-pull-exist-tags-delete.sh"
git_command="git pull"
echo "log errors from ${git_command} to ${log}"
${git_command} 2>&1 | > ${log}
echo "show errors from ${log}"
cat ${log}
echo create ${script}
touch ${script}
echo "add execute (+x) permissions to ${script}"
chmod +x ${script}
echo "generate ${script} from errors log ${log}"
${git_command} 2>&1 | grep 'exists' | sed -n "s:.*\: 'refs/tags/\(.*\)' exists;.*:git tag -d '\1':p" >> ${script}
echo "execute ${script}"
${script}
git pull

echo push
log="git-push-errors.log"
script="./git-push-exist-tags-delete.sh"
git_command="git push"
echo "log errors from ${git_command} to ${log}"
${git_command} 2>&1 | > ${log}
echo "show errors from ${log}"
cat ${log}
echo create ${script}
touch ${script}
echo "add execute (+x) permissions to ${script}"
chmod +x ${script}
echo "generate ${script} from errors log ${log}"
${git_command} 2>&1 | grep 'exists' | sed -n "s:.*\: 'refs/tags/\(.*\)' exists;.*:git tag -d '\1':p" >> ${script}
echo "execute ${script}"
${script}
git push

উপরের স্ক্রিপ্টটি XXX- ত্রুটিগুলিতে ত্রুটিগুলি লগ করবে log নীচের কমান্ডগুলি ব্যবহার করে XXX- ত্রুটিগুলি থেকে স্বয়ংক্রিয়ভাবে একটি এক্সএক্সএক্সিস্ট-ট্যাগস- ডিলেট.শ্রেট তৈরি এবং চালিয়ে এগুলি ঠিক করবে:

  1. গিট আপডেট-রেফ-ডি রেফ / ট্যাগ
  2. গিট আনা
  3. গিট টান
  4. গিট ঠেলা


1

উইন্ডোজ ব্যবহারকারী হিসাবে, সমাধানের কোনওোটাই আমার পক্ষে সমস্যার সমাধান করেনি। আমি এই ত্রুটিটি দেখার কারণটি ছিল (অপির শাখার নামগুলি ব্যবহার করে) আমি একটি শাখা তৈরি করার চেষ্টা করছিলাম dev/subকিন্তু অন্য কেউ একটি শাখা তৈরি করেছিল Devযা আমরা সবাই জানি, উইন্ডোগুলির একটি কেস সংবেদনশীল ফাইল সিস্টেম রয়েছে।

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

সমাধানটি ছিল Devস্থানীয়ভাবে এবং দূরবর্তী সাথে শাখাটি মোছা git branch -d Dev && git push origin :Dev। এই git pullপরে ঠিক আছে।

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


1

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

- হটফিক্স ---- হটফিক্স / 1234_bug ---- হটফিক্স / 3456_বাগ

সুতরাং আমি নিম্নলিখিত ত্রুটি পেয়েছিলাম:

Fetching from origin Error: cannot lock ref 'refs/remotes/origin/hotfix/1234_bug': 'refs/remotes/origin/hotfix' exists; cannot create 'refs/remotes/origin/hotfix'

অনুরূপ ত্রুটিগুলি অনুসন্ধান করার পরে অবশেষে আমি এখানে একটি আলোচনার থ্রেডে সমাধান পেয়েছি ।

git remote prune origin


0

এর নাম পরিবর্তন dev/subকরুন dev/sub/something, তারপরে আপনি শাখা তৈরি করতে পারেন dev/sub/master

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