গিট - 'অনুমান-অপরিবর্তিত' এবং 'স্কিপ-ওয়ার্কট্রি' এর মধ্যে পার্থক্য


450

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

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


1
সাধারণত আমি .gitignoreএকই উদ্দেশ্যে ব্যবহার করছি । এই সমাধান আপনার জন্য কাজ করবে?
সামুয়েল

45
সামুয়েল, .gitignore পরিবর্তন করা হয় না যোগ করা উপেক্ষা। ফাইলটি ইতিমধ্যে গিট এ থাকলে এটি .gitignore তালিকাভুক্ত থাকলে ইভেন্টটিকে ট্র্যাক করা হবে
গ্রিগরি

তবে কেউ কি এখানে সমস্ত ব্যাখ্যা সরিয়ে "রিফ্রেশ" করতে সমস্ত কিছু যুক্ত করতে পারে না? stackoverflow.com/questions/7075923/... @Grigory
ড্যানিয়েল স্প্রিঙ্গের

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

উত্তর:


665

আপনি চান skip-worktree

assume-unchangedএমন একটি ক্ষেত্রে ডিজাইন করা হয়েছে যেখানে ফাইলগুলির একটি গ্রুপ পরিবর্তন করা হয়েছে কিনা তা পরীক্ষা করা ব্যয়বহুল; আপনি যখন বিট সেট করেন, git(অবশ্যই) ধরে নেওয়া যায় যে সূচকের সেই অংশের সাথে সম্পর্কিত ফাইলগুলি কার্যকরী অনুলিপিতে পরিবর্তন করা হয়নি। সুতরাং এটি statকলগুলির মধ্যে একটি গণ্ডগোল এড়িয়ে চলে avo এই বিটটি হারিয়ে যাবে যখনই সূচীতে ফাইলের প্রবেশ পরিবর্তন হবে (সুতরাং ফাইলটি যখন প্রবাহে পরিবর্তিত হবে)।

skip-worktreeএর চেয়েও বেশি: এমনকি যেখানে git জানে যে ফাইলটি সংশোধন করা হয়েছে (বা কোনও reset --hardবা এর মতো করে সংশোধন করা দরকার ), এটি ভান করে এটি পরিবর্তিত হয়নি, পরিবর্তে সূচক থেকে সংস্করণটি ব্যবহার করে। সূচি বাতিল না হওয়া পর্যন্ত এটি অব্যাহত থাকে।

এই পার্থক্যের ছড়িয়ে পড়া এবং সাধারণ ব্যবহারের ক্ষেত্রে এখানে খুব ভাল সংক্ষিপ্তসার রয়েছে: http : //fallengamer.livej पत्रकार . com / 93321.html

এই নিবন্ধ থেকে:

  • --assume-unchangedধরে নেওয়া যায় যে কোনও বিকাশকারীকে কোনও ফাইল পরিবর্তন করা উচিত নয় । এই পতাকাটি এসডিকে-র মতো ফোল্ডারগুলি পরিবর্তন না করে পারফরম্যান্সের উন্নতির জন্য।
  • --skip-worktreeযখন আপনি গিটকে নির্দিষ্ট ফাইলটি স্পর্শ না করার নির্দেশ দেন তখনই কার্যকর কারণ বিকাশকারীদের উচিত এটি পরিবর্তন করা । উদাহরণস্বরূপ, যদি মূল সংগ্রহস্থল প্রবাহে কিছু উত্পাদন-প্রস্তুত কনফিগারেশন ফাইল হোস্ট করে এবং আপনি দুর্ঘটনাক্রমে files ফাইলগুলিতে পরিবর্তন করতে চান না, --skip-worktreeআপনি যা চান তা ঠিক তাই।

3
এটা বোধগম্য. স্কিপ-ওয়ার্কট্রি সত্যিই যাওয়ার উপায় বলে মনে হয় না। ধন্যবাদ!
সিকেবি

99
কয়েক সেকেন্ড অনুসন্ধান এবং পড়া সংরক্ষণ করার জন্য একটি ছোট নোট। --skip-worktreeপ্রভাবগুলি বাতিল করতে এবং পতাকাটি আনসেট করার জন্য --no-skip-worktreeবিকল্প রয়েছে। ঠিক একইভাবে কাজ করে। যদি কোনও হাত পিছলে যায় এবং ভুল ফাইলগুলি পতাকাঙ্কিত হয়, বা যদি পরিস্থিতি পরিবর্তিত হয় এবং পূর্বে এড়িয়ে যাওয়া ফাইলগুলিকে আর উপেক্ষা করা না যায় সে ক্ষেত্রে এটি কার্যকর।
drdaeman

18
উপরে আমার নিজের প্রশ্নের উত্তর দিতে, ব্যবহার --skip-worktreeএবং .git/info/excludeফাইলের মধ্যে পার্থক্যটি হ'ল প্রাক্তন বর্তমানে ট্র্যাক করা ফাইলগুলির জন্যও কাজ করবে। .git/info/excludeযেমন .gitignore, কেবলমাত্র সূচিক্রমে অনিয়ন্ত্রিত ফাইল যুক্ত করা রোধ করবে, কিন্তু ইতিমধ্যে ট্র্যাক করা ফাইলগুলিতে পরিবর্তন আনবে না।
লিনাসআর

13
এটিকে কি দূরবর্তী স্থানে ঠেকিয়ে সমস্ত ক্লোন দ্বারা সংরক্ষণ করা যেতে পারে?
সিএমসিডিগ্রাগনকাই

4
শুধু ব্যবহার , ম্যাম:git update-index --skip-worktree <file_name>
রাফিন

108

দ্রষ্টব্য: ফ্যালঞ্জেমার ২০১১ সালে কিছু পরীক্ষা করেছিলেন (যাতে তারা পুরানো হতে পারে), এবং তার অনুসন্ধানগুলি এখানে :

অপারেশনস

  • স্থানীয় সংগ্রহস্থল এবং প্রবাহে ফাইল উভয়ই পরিবর্তিত হয়েছে
    git pull:
    গিট যাইহোক স্থানীয় পরিবর্তনগুলি সংরক্ষণ করে।
    সুতরাং আপনি দুর্ঘটনাক্রমে যে কোনও পতাকা ব্যবহার করে চিহ্নিত করেছেন এমন কোনও ডেটা হারাবেন না।
    • সাথে ফাইল assume-unchangedপতাকা : গিট স্থানীয় ফাইল ওভাররাইট করতে পারে না। পরিবর্তে এটি দ্বন্দ্বগুলি আউটপুট দেয় এবং সেগুলি কীভাবে সমাধান করা যায় সে বিষয়ে পরামর্শ দেয়
    • skip-worktreeপতাকা সহ ফাইল : গিট স্থানীয় ফাইল ওভাররাইট করতে পারে না। পরিবর্তে এটি দ্বন্দ্বগুলি আউটপুট দেয় এবং সেগুলি কীভাবে সমাধান করা যায় সে বিষয়ে পরামর্শ দেয়

  • ফাইল স্থানীয় সংগ্রহস্থল এবং প্রবাহ উভয়ই পরিবর্তিত হয়, যাইহোক ব্যবহার করে টানতে চেষ্টা করে
    git stash
    git pull
    skip-worktree কিছু অতিরিক্ত ম্যানুয়াল কাজের ফলাফল করে তবে আপনার কোনও স্থানীয় পরিবর্তন থাকলে কমপক্ষে কোনও ডেটা হারাবেন না।
    • assume-unchangedপতাকা সহ ফাইল : সমস্ত স্থানীয় পরিবর্তনগুলি পুনরুদ্ধার করার কোনও সম্ভাবনা ছাড়াই তা বাতিল করে দেয়। প্রভাবটি ' git reset --hard' এর মতো । 'git pull ' কল সফল হবে
    • skip-worktreeপতাকা সহ ফাইল : স্ট্যাশ skip-worktreeফাইলগুলিতে কাজ করবে না । ' git pull' উপরের মত একই ত্রুটি নিয়ে ব্যর্থ হবে। বিকাশকারী skip-worktreeস্ট্যাশ করতে এবং ব্যর্থতা সম্পূর্ণ করতে সক্ষম হয়ে ম্যানুয়ালি পতাকাটি পুনরায় সেট করতে বাধ্য হয় pull

  • কোনও স্থানীয় পরিবর্তন নেই, আপস্ট্রিম ফাইল পরিবর্তিত হয়েছে উভয় পতাকাই আপনাকে প্রবাহের পরিবর্তনগুলি আটকাতে পারবে না। গিট সনাক্ত করে যে আপনি প্রতিশ্রুতি ভঙ্গ করেছেন এবং পতাকাটি পুনরায় সেট করে বাস্তবতা প্রতিফলিত করতে বেছে নিয়েছেন।
    git pull
    assume-unchanged
    • assume-unchangedপতাকা সহ ফাইল : সামগ্রী আপডেট হয়েছে, পতাকা হারিয়েছে।
      ' git ls-files -v' দেখায় যে পতাকাটি H(থেকে h) এ পরিবর্তিত হয়েছে ।
    • skip-worktreeপতাকা সহ ফাইল : সামগ্রী আপডেট করা হয়েছে, পতাকা সংরক্ষণ করা হয়েছে।
      ' git ls-files -v' Sপূর্বের মতো একই পতাকা প্রদর্শন করবে pull

  • স্থানীয় ফাইল পরিবর্তিত হওয়ার সাথে গিট ফাইলটি স্পর্শ করে না এবং বাস্তবের প্রতিফলন করে (ফাইলটি পরিবর্তিত হওয়ার প্রতিশ্রুতি দেওয়া ফাইলটি আসলে পরিবর্তিত হয়েছিল) ।
    git reset --hard
    skip-worktreeassume-unchanged
    • ফাইল assume-unchangedপতাকা: ফাইল বিষয়বস্তু প্রত্যাবর্তন করা হয়। ফ্ল্যাগটি H(থেকে h) এ পুনরায় সেট করা হয়েছে ।
    • ফাইল skip-worktreeপতাকা: ফাইল বিষয়বস্তু অক্ষত। পতাকা একই থাকে।

তিনি নিম্নলিখিত বিশ্লেষণ যোগ করেছেন:

  • দেখে মনে skip-worktreeহচ্ছে আপনার স্থানীয় ডেটা সংরক্ষণের জন্য খুব চেষ্টা করছে । তবে এটি সুরক্ষিত থাকলে আপনাকে উজানের পরিবর্তনগুলি পেতে বাধা দেয় না। প্লাস গিটটি পতাকাটি পুনরায় সেট করে না pull
    তবে ' reset --hard' আদেশটি উপেক্ষা করা কোনও বিকাশকারীর পক্ষে খারাপ অভ্যাস হতে পারে become

  • Assume-unchangedpullঅপারেশনে পতাকাটি হারিয়ে যেতে পারে এবং এই জাতীয় ফাইলগুলির মধ্যে স্থানীয় পরিবর্তনগুলি গিট করা গুরুত্বপূর্ণ বলে মনে হয় না।

দেখা:

তিনি শেষ করেছেন:

আসলে পতাকা দুটিই যথেষ্ট স্বজ্ঞাত নয়

  • assume-unchangedধরে নেওয়া যায় যে কোনও বিকাশকারীকে কোনও ফাইল পরিবর্তন করা উচিত নয়। যদি কোনও ফাইল পরিবর্তন করা হয় - তবে সেই পরিবর্তনটি গুরুত্বপূর্ণ নয়। এই পতাকাটি এসডিকে-র মতো ফোল্ডারগুলি পরিবর্তন না করে পারফরম্যান্সের উন্নতির জন্য।
    কিন্তু যদি প্রতিশ্রুতিটি ভঙ্গ হয়ে যায় এবং কোনও ফাইল আসলে পরিবর্তিত হয়, গিট বাস্তবটিকে প্রতিফলিত করতে পতাকাটিকে উল্টে দেয়। সাধারণত ঠিক-পরিবর্তে-পরিবর্তন-করা ফোল্ডারগুলিতে কিছু অসম্পূর্ণ পতাকা থাকা ঠিক আছে ok

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


গিট ২.২৫.১ (ফেব্রুয়ারি ২০২০) দিয়ে উপরে উল্লিখিত "প্রকৃতপক্ষে পতাকাগুলির মধ্যে উভয়ই যথেষ্ট স্বজ্ঞাত নয়" আরও স্পষ্ট করে বলা হয়েছে:

কমিট 7a2dc95 দেখুন , প্রতিশ্রুতিবদ্ধ 1b13e90 (22 জানুয়ারী 2020) দ্বারা ব্রায়ান এম। কার্লসন ( bk2204)
(দ্বারা একীভূত junio সি Hamano - gitster- মধ্যে কমিট 53a8329 , 30 জানুয়ারী 2020)
( গীত মেইলিং লিস্টের )

doc: ব্যবহারকারীদের ট্র্যাক করা ফাইল উপেক্ষা করার চেষ্টা থেকে বিরত করুন

সাইন-অফ-বাই: জেফ কিং
স্বাক্ষরিত-অফ-বাই: ব্রায়ান মি। কার্লসন

গিট ট্র্যাক করে এমন কোনও ফাইলের পরিবর্তনগুলি উপেক্ষা করতে ব্যবহারকারীদের পক্ষে এটি বেশ সাধারণ বিষয়।

এই ক্ষেত্রে সাধারণ পরিস্থিতিগুলি হ'ল আইডিই সেটিংস এবং কনফিগারেশন ফাইলগুলি, যা সাধারণত ট্র্যাক করা উচিত নয় এবং সম্ভবত একটি টেম্প্লেটিং মেকানিজম ব্যবহার করে ট্র্যাক করা ফাইলগুলি থেকে উত্পন্ন করা উচিত।

তবে, ব্যবহারকারীরা অনুমান-অপরিবর্তিত রয়েছে এবং ওয়ার্কট্রি বিটগুলি এড়িয়ে যান এবং যেকোন উপায়ে এটি করার জন্য তাদের ব্যবহার করার চেষ্টা করেন।

এটি সমস্যাযুক্ত, কারণ যখন এই বিটগুলি সেট করা হয়, তখন অনেক অপারেশন ব্যবহারকারীর প্রত্যাশা অনুযায়ী আচরণ করে, তবে git checkoutফাইলটি প্রতিস্থাপন করার প্রয়োজনে তারা সাধারণত সহায়তা করে না ।

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

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

এছাড়াও, অনেকগুলি পরিবেশে সফলভাবে ব্যবহৃত সুপরিচিত পন্থাগুলি হওয়ায় কনফিগারেশন ফাইলগুলির সাধারণ ক্ষেত্রে কাজ করার জন্য একটি প্রস্তাবিত সমাধান সরবরাহ করি।

git update-indexMan পৃষ্ঠা এখন রয়েছে:

ব্যবহারকারীরা প্রায়শই গিটকে ট্র্যাকযুক্ত ফাইলগুলিতে পরিবর্তনগুলি উপেক্ষা করতে বলার জন্য assume-unchangedএবং skip-worktreeবিটগুলি ব্যবহার করার চেষ্টা করেন । এটি আশানুরূপভাবে কাজ করে না, যেহেতু গিট নির্দিষ্ট ক্রিয়াকলাপ সম্পাদন করার সময় সূচকের বিপরীতে কার্যকারী ট্রি ফাইলগুলি পরীক্ষা করতে পারে। সাধারণভাবে, গিট ট্র্যাক করা ফাইলগুলিতে পরিবর্তনগুলি উপেক্ষা করার কোনও উপায় সরবরাহ করে না, তাই বিকল্প সমাধানের প্রস্তাব দেওয়া হচ্ছে।

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

যে শেষ অংশ আমি একজন সাধারণ বর্ণনা করে তা হল সামগ্রীর ফিল্টার ছাপ / পরিষ্কার স্ক্রিপ্ট উপর ভিত্তি করে চালক


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

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

1
@ গ্রীনআসজেডের চেয়ে প্রাচীন মনে হচ্ছে। যে কোনও সুযোগ আপনি এটি 2.2.x দিয়ে পরীক্ষা করতে পারবেন?
ভনসি

1
@ ভনসি, "জুনিওর মন্তব্য" এর লিঙ্কটি পুনর্বিবেচনার ইতিহাসে নেই। কি এই কি আপনি উল্লেখ করা হয়েছে?
মাইকেল - ক্লে শির্কি হ'ল

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