গিট রিমোট ছাঁটাই, গিট ছাঁটাই, গিট আনতে - ছাঁটাই ইত্যাদির মধ্যে পার্থক্য কী?


358

আমার অবস্থাটি হ'ল ... একই রেপোতে কাজ করা কেউ তার স্থানীয় ও দূরবর্তী রেপো থেকে একটি শাখা মুছে ফেলেছে ...

বেশিরভাগ লোকেরা যারা স্ট্যাক ওভারফ্লো বা অন্যান্য সাইটগুলিতে এই ধরণের সমস্যা সম্পর্কে জিজ্ঞাসা করেছেন তাদের শাখাগুলির ইস্যুটি এখনও git branch -aনীচে তাদের দূরবর্তী ট্র্যাকিং শাখার তালিকায় প্রদর্শিত হচ্ছে:

* master
  develop
  feature_blah
  remotes/origin/master
  remotes/origin/develop
  remotes/origin/feature_blah
  remotes/origin/random_branch_I_want_deleted

তবে, আমার পরিস্থিতিতে শাখাটি সেখানে থাকা উচিত নয়, এটি স্থানীয়:

* master
  develop
  feature_blah
  random_branch_I_want_deleted
  remotes/origin/master
  remotes/origin/develop
  remotes/origin/feature_blah

আমি নিম্নলিখিতগুলির মধ্যে যখন কোনটি করি, তখন এটি স্থানীয়ভাবে সরানো হয় না:

$ git prune

আমি চেষ্টাও করেছি:

$ git remote prune origin
$ git fetch --prune

আরও দরকারী তথ্য: আমি যখন যাচাই করি git remote show originএটি কেমন দেখাচ্ছে:

* remote origin
Fetch URL: utilities:homeconnections_ui.git
Push  URL: utilities:homeconnections_ui.git
HEAD branch: master
Remote branches:
 master                        tracked
 develop                       tracked
 feature_blah                  tracked
 other123                      tracked
 other444                      tracked
 other999                      tracked
Local branches configured for 'git pull':
 develop                      merges with remote develop
 feature_blah                 merges with remote other999
 master                       merges with remote master
 random_branch_I_want_deleted merges with remote random_branch_I_want_deleted
Local refs configured for 'git push':
 develop         pushes to develop     (local out of date)
 master          pushes to master      (up to date)
 feature_blah    pushes to feature_blah(up to date)

লক্ষ্য করুন যে এটি কেবল শিরোনামে বিভাগে রয়েছে Local branches configured for 'git pull':

কেন?


git branch -d the_local_branch
krsteeve

1
ধন্যবাদ, তবে কেন এটি ঘটতে পারে তা সম্পর্কে আমি আগ্রহী।
gogogadgetinternet

শাখার শ্রেণিবিন্যাস নিয়ে কাজ করার ক্ষেত্রে একটি সূক্ষ্ম পার্থক্য ছিল ( x/y): এটি ঠিক করা হয়েছে ( আমার উত্তর নীচে দেখুন )
ভোনসি

উত্তর:


664

এই সম্পর্কে হতাশ হওয়ার জন্য আমি আপনাকে দোষ দিচ্ছি না। দেখার সেরা উপায় এটি। প্রতিটি প্রত্যন্ত শাখার সম্ভাব্য তিনটি সংস্করণ রয়েছে:

  1. দূরবর্তী সংগ্রহস্থলের প্রকৃত শাখা
    (যেমন, https://example.com/repo.git এ রিমোট রেপো , refs/heads/master)
  2. স্থানীয়ভাবে আপনার এই শাখার স্ন্যাপশট (এর অধীনে সঞ্চিত refs/remotes/...)
    (যেমন স্থানীয় রেপো, refs/remotes/origin/master)
  3. এবং একটি স্থানীয় শাখা যা দূরবর্তী শাখা ট্র্যাক করতে পারে
    (যেমন স্থানীয় রেপো, refs/heads/master)

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

git remote prune originএবং git fetch --pruneউভয়ই নীচে রেফারেন্সগুলিতে পরিচালনা করে refs/remotes/...(আমি এগুলিকে দূরবর্তী উল্লেখ হিসাবে উল্লেখ করব)। এটি স্থানীয় শাখাগুলিকে প্রভাবিত করে না। git remoteআপনি শুধুমাত্র একটি নির্দিষ্ট দূরবর্তী অধীনে দূরবর্তী রেফারেন্স সরাতে চান সংস্করণ দরকারী। অন্যথায়, দুজন ঠিক একই জিনিস করেন। সুতরাং, সংক্ষেপে, git remote pruneএবং git fetch --pruneউপরের 2 নম্বরে অপারেট করুন। উদাহরণস্বরূপ, আপনি যদি গিট ওয়েব জিইউআই ব্যবহার করে কোনও শাখা মুছে ফেলেন এবং এটি আপনার স্থানীয় শাখার তালিকায় আর দেখাতে চান না ( git branch -r), তবে আপনার ব্যবহার করা উচিত সেই আদেশটি।

স্থানীয় শাখা অপসারণ করতে আপনার ব্যবহার করা উচিত git branch -d(বা -Dএটি কোথাও একত্রীকরণ না করা থাকলে)। এফডাব্লুআইডাব্লু, দূরবর্তী শাখাটি অদৃশ্য হয়ে গেলে স্থানীয় ট্র্যাকিং শাখাগুলি স্বয়ংক্রিয়ভাবে সরানোর জন্য গিট কমান্ড নেই।


22
প্রাসঙ্গিক পার্থক্য ব্যাখ্যা করে সামগ্রিক প্রশ্নকে সম্বোধন করার এটি আরও ভাল কাজ করে। এটি উপরের প্রশ্ন থেকে আমার কাছে থাকা অতিরিক্ত প্রশ্নেরও উত্তর দেয়।
গোগোগ্যাজেটইন্টারনেট

14
এই কমান্ডটি সমস্ত স্থানীয় শাখাগুলির একটি তালিকা প্রদর্শন করবে যার সংশ্লিষ্ট দূরবর্তী শাখা নেই। আপনি এটিটি পাইপ করতে পারেন xargs git branch -Dতবে নোট করুন যে আপনি যে নতুন শাখা তৈরি করেছেন কিন্তু সার্ভারে কখনও ঠেলেছেন তা মুছে ফেলা হবে, তাই সাবধানে পদক্ষেপ করুন: git branch -r | awk '{print $1}' | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk '{print $1}'
জেসন ওয়ালটন

4
পছন্দ করুন :-( এটা শুধুমাত্র স্থানীয় দূরবর্তী ট্র্যাকিং refs মুছে ফেলে আমি শুধু এই সংস্করণে 2.7.0 সঙ্গে ডাবল চেক করা।।
জন Szakmeister

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

1
@ ক্লাউড সম্পূর্ণ সত্য নয়। রেফারেন্সগুলি প্যাক করা যেতে পারে (এই অঞ্চলে packed-refsফাইলটি দেখুন .git), তাই এটি ফাইল এক্সপ্লোরারের মাধ্যমে মুছে ফেলার কোনও সহজ বিষয় নয়। উভয়কে সঠিকভাবে যত্ন নেওয়া হয়েছে তা নিশ্চিত করতে কমান্ডগুলি ব্যবহার করা আরও ভাল।
জন স্মাকমিস্টার

55

git remote pruneএবং git fetch --pruneএকই জিনিসটি করুন: যেমনটি আপনি বলেছেন যে রিমোটে নেই এমন শাখাগুলির রেফগুলি মুছে ফেলা হচ্ছে। দ্বিতীয় কমান্ড রিমোটের সাথে সংযোগ স্থাপন করে এবং ছাঁটাই করার আগে এর বর্তমান শাখাগুলি আনে।

তবে আপনি যে স্থানীয় শাখাগুলি যাচাই করেছেন তা স্পর্শ করে না, যা আপনি সহজেই মুছতে পারেন

git branch -d  random_branch_I_want_deleted

যদি অন্য কোথাও শাখাটি মার্জ না করা -dহয় -Dতবে তার দ্বারা প্রতিস্থাপন করুন

git prune অন্যরকম কিছু করে, এটি অ্যাক্সেসযোগ্য অবজেক্টগুলিকে শুদ্ধ করে, সেই কমিটগুলি যে কোনও শাখা বা ট্যাগে পৌঁছনীয় নয় এবং এইভাবে আর প্রয়োজন হয় না।


1
আমি জানি এটি সুস্পষ্ট বলে মনে হচ্ছে, তবে git pruneকেবল শাখা এবং ট্যাগগুলির জন্যই নয়, অন্য সমস্ত রেফগুলিও দেখায়।

তাহলে আমার ক্ষেত্রে, ছিদ্র ছাঁটাই কাজ করবে না কেন? কারণ এটি স্থানীয় শাখাগুলি সম্পর্কে চিন্তা করে না, তবে দূরবর্তী রেফারেন্সগুলি? সংক্ষিপ্ত তথ্যের জন্য ধন্যবাদ।
gogogadgetinternet

@hvd শাখা এবং ট্যাগ ব্যতীত আর কি ধরণের রেফ রয়েছে?
চার্লসবি

@ gogogadgetinternet হ্যাঁ (ধরুন আপনি বোঝাচ্ছেন git remote prune)
চার্লসবি

4
আইটেমো সংগ্রহ এবং রেফারেন্স-ক্লিনআপ উভয়ের জন্য "ছাঁটাই" ব্যবহারের গিট নামকরণের কনভেনশন আইএমও যেখানে বিভ্রান্তি স্থাপন করে। তবে গিটে এটি অনেকগুলি ইউআই ধাঁধাগুলির মধ্যে একটি। :-)
টেরিক

14

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

আপনি যদি ছেলেরা এর সাথে কোনও সমস্যা দেখতে পান তবে দয়া করে আমাকে জানান এবং আমি এটি ঠিক করব (ইত্যাদি)

এটি চালানো git-rm-ntb(চালিয়ে যাওয়া কল করুন) নামে একটি ফাইলে এটিকে সংরক্ষণ করুন PATHএবং চালান:

git-rm-ntb <remote1:optional> <remote2:optional> ...

clean()
{
  REMOTES="$@";
  if [ -z "$REMOTES" ]; then
    REMOTES=$(git remote);
  fi
  REMOTES=$(echo "$REMOTES" | xargs -n1 echo)
  RBRANCHES=()
  while read REMOTE; do
    CURRBRANCHES=($(git ls-remote $REMOTE | awk '{print $2}' | grep 'refs/heads/' | sed 's:refs/heads/::'))
    RBRANCHES=("${CURRBRANCHES[@]}" "${RBRANCHES[@]}")
  done < <(echo "$REMOTES" )
  [[ $RBRANCHES ]] || exit
  LBRANCHES=($(git branch | sed 's:\*::' | awk '{print $1}'))
  for i in "${LBRANCHES[@]}"; do
    skip=
    for j in "${RBRANCHES[@]}"; do
      [[ $i == $j ]] && { skip=1; echo -e "\033[32m Keeping $i \033[0m"; break; }
    done
    [[ -n $skip ]] || { echo -e "\033[31m $(git branch -D $i) \033[0m"; }
  done
}

clean $@

ধন্যবাদ! রঙিন আউটপুট ;
বিভেঞ্জেরভ

2
Merge (গিট শাখা-ডি $ i) কেবল মার্জ শাখাগুলি মুছে ফেলা নিরাপদ হবে না?
ব্যবহারকারী2012677

তাই সহায়ক আপনাকে অনেক ধন্যবাদ !!!
রবিন হার্টল্যান্ড

নিরাপদ অপশন আলোচনা করা হয়েছে stackoverflow.com/questions/7726949/...
মাইকেল Freidgeim

13

মনে রাখবেন যে টম মিলার ( ) (গিট 1.9 / 2.0, কিউ 1 2014 এর জন্য ) দ্বারা প্রতিশ্রুতি 10a6cc8 এর মধ্যে git remote --pruneএবং এর মধ্যে একটি পার্থক্য git fetch --pruneস্থির করা হচ্ছে :tmiller

যখন আমাদের frotz/nitfolআগের ফিঞ্চ থেকে " " নামক একটি রিমোট ট্র্যাকিং শাখা রয়েছে এবং এখন প্রবাহে "** ফ্রটজ " ** নামে একটি শাখা রয়েছে , উজান থেকে fetch" frotz/nitfol" দিয়ে " " অপসারণ করতে ব্যর্থ হবে git fetch --prune
গিট git remote pruneসমস্যাটি সমাধানের জন্য ব্যবহারকারীকে " " ব্যবহার করতে জানায় ।

সুতরাং: যখন একটি উজানের রেপোতে একটি শাখা ("ফ্রটজ") একই শাখার হায়ারার্কি ("ফ্রটজ / এক্সএক্সএক্সএক্স", একটি সম্ভাব্য শাখার নামকরণ কনভেনশন ) এর একই নামটি git remote --pruneসফল হয়েছিল (আপনার রেপো থেকে দূরবর্তী ট্র্যাকিং শাখা পরিষ্কার করার ক্ষেত্রে) , কিন্তু git fetch --pruneব্যর্থ ছিল।

আর না:

fetch --pruneআনার ক্রিয়াকলাপের আগে ছাঁটাই অপারেশন সরিয়ে " " কাজ করার উপায়টি পরিবর্তন করুন।
এইভাবে, কোনও বিরোধকে ব্যবহারকারীকে সতর্ক করার পরিবর্তে এটি স্বয়ংক্রিয়ভাবে এটিকে ঠিক করে দেয়।

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