আমি কি কোনও ফাইল 'গিট কমিট' করতে এবং এর সামগ্রীর পরিবর্তনগুলি উপেক্ষা করতে পারি?


355

আমার দলের প্রতিটি বিকাশকারীর নিজস্ব স্থানীয় কনফিগারেশন রয়েছে। এই কনফিগারেশন তথ্যটি এমন একটি ফাইলে সংরক্ষণ করা হয় devtargets.rbযা আমাদের রেক বিল্ডিং কাজে ব্যবহৃত হয়। যদিও আমি বিকাশকারীদের একে অপরের ডিভেটেরেটস ফাইলটি ক্লোবারের জন্য চাই না।

আমার প্রথম চিন্তাটি সেই ফাইলটিকে .gitignoreতালিকায় রাখার জন্য যাতে এটি গিটের প্রতিশ্রুতিবদ্ধ না হয়।

তারপরে আমি ভাবতে শুরু করি: ফাইলটি প্রতিশ্রুতি দেওয়া কি সম্ভব, তবে ফাইলের পরিবর্তনগুলি উপেক্ষা করবেন? সুতরাং, আমি ফাইলটির একটি ডিফল্ট সংস্করণ করব এবং তারপরে যখন কোনও বিকাশকারী তাদের স্থানীয় মেশিনে এটি পরিবর্তন করে, গিট পরিবর্তনগুলি উপেক্ষা করবে এবং আপনি গিট স্ট্যাটাস বা গিট কমিট করার সময় এটি পরিবর্তিত ফাইলগুলির তালিকায় প্রদর্শিত হবে না would ।

এটা কি সম্ভব? এটি অবশ্যই একটি দুর্দান্ত বৈশিষ্ট্য হবে ...




উত্তর:


458

অবশ্যই, আমি সময় সময় ব্যবহার করে ঠিক এটি করি

git update-index --assume-unchanged [<file> ...]

পূর্বাবস্থায় ফিরে আসার জন্য এবং আবার ট্র্যাকিং শুরু করতে (যদি আপনি ভুলে গিয়েছিলেন যে কোন ফাইলগুলি তালাবিহীন ছিল, এই প্রশ্নটি দেখুন ):

git update-index --no-assume-unchanged [<file> ...]

প্রাসঙ্গিক ডকুমেন্টেশন :

- [no-] অনুমান-অপরিবর্তিত
এই পতাকাটি নির্দিষ্ট করা হলে, পাথগুলির জন্য রেকর্ড করা অবজেক্টের নামগুলি আপডেট হয় না। পরিবর্তে, এই বিকল্পটি পাথগুলির জন্য "ধার্য অপরিবর্তিত" বিট সেট / আনসেট করে। যখন "অনুমান অপরিবর্তিত" বিট চালু থাকে তখন ব্যবহারকারী ফাইলটি পরিবর্তন না করার প্রতিশ্রুতি দেয় এবং গিটকে ধরে নিতে অনুমতি দেয় যে কার্যকারী ট্রি ফাইলটি সূচীতে রেকর্ড করা আছে তার সাথে মেলে। আপনি যদি কাজের গাছের ফাইলটি পরিবর্তন করতে চান তবে গিটকে জানানোর জন্য আপনাকে বিটটি আনসেট করতে হবে। খুব ধীর lstat(2)সিস্টেম কল (যেমন সিআইএফ) থাকা কোনও ফাইল সিস্টেমে কোনও বড় প্রকল্পের সাথে কাজ করার সময় এটি কখনও কখনও সহায়ক হয় ।

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

এই ক্ষেত্রে কৃত্রিমভাবে ব্যর্থ হওয়ার অর্থ হ'ল, আপনি যখন কোনও টান দেবেন তখন যদি সেই ফাইলটিতে (বৈধ পরিবর্তনগুলি, ইত্যাদি) প্রবাহিত প্রবাহে কিছু পরিবর্তন হয়, তবে এটি বলবে:

$ git pull
…
From https://github.com/x/y
   72a914a..106a261  master     -> origin/master
Updating 72a914a..106a261
error: Your local changes to the following files would be overwritten by merge:
                filename.ext

এবং মার্জ করতে অস্বীকার করবে।

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

 $ git checkout filename.ext

তারপরে আবার টানুন এবং আপনার স্থানীয় ফাইলটি পুনরায় সংশোধন করুন, বা সেট করতে পারে –no-assume-unchangedএবং আপনি সেই সময়ে সাধারণ স্ট্যাশ এবং মার্জ ইত্যাদি করতে পারেন।


10
এই কমান্ডটি স্থানীয়ভাবে .git ফোল্ডারে তার কাজটি করে? মানে আমি যদি কনফিগারেশন.এফপি ফাইলের জন্য এই কমান্ডটি চালিত করি তবে এটি কি রেপো ব্যবহার করে এমন অন্যান্য ব্যবহারকারীদের কাছে প্রচার করবে?
মাগাস

16
@ ম্যাগাস: না এটি কেবল আপনার জন্য কাজ করবে।
রব উইকারসন

3
: এবং শীঘ্রই পরে আপনাকে জানতে হবে তা নির্ধারণ করতে কিভাবে একটি ফাইল অধিকৃত হয় অপরিবর্তিত চান যাচ্ছি stackoverflow.com/questions/2363197/...
সিরো Santilli郝海东冠状病六四事件法轮功

10
"গিট স্ট্যাশ" ব্যবহার করা হলে এই উপায়ে ফাইলগুলিতে করা পরিবর্তনগুলি হারিয়ে যায়। যে কাছাকাছি একটি উপায় আছে কি?
অ্যালেক্সিস

5
এটি কি git update-index --assume-unchangedজন্য নয়। public-inbox.org/git/…
jsageryd

97

এটি করার পছন্দের উপায়টি হ'ল ব্যবহার করা git update-index --skip-worktree <file>, যা এই উত্তরে বর্ণিত :

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

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

এটি পূর্বাবস্থায় ফেলার জন্য ব্যবহার করুন git update-index --no-skip-worktree <file>

গিট সংস্করণ ২.২৫.১ থেকে যেহেতু এটি আর সুপারিশ করা উপায় নয়, উদ্ধৃত করে:

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

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


এই সংগ্রহস্থলটি চেকআউট করে এমন সমস্ত ব্যবহারকারী জুড়ে কাজ করে? তারা কি নির্দিষ্ট ফাইলগুলি পাবে তবে স্পষ্টভাবে না বলা পর্যন্ত ভুলক্রমে পরিবর্তনগুলি যুক্ত করতে পারবে না?
মিমি

2
@ মোমোমো পতাকাটি সূচীতে সংরক্ষণ করা হয়েছে তাই না, এটি কেবলমাত্র একক ব্যবহারকারীর জন্য। এমন কিছুর জন্য ইরজিয়াংয়ের উত্তর দেখুন যা সমস্ত ব্যবহারকারীর জুড়ে কাজ করে।
1615903

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

আমি অনুসরণ করছি না কমান্ডটি নির্দিষ্ট করে দেওয়া একটি নির্দিষ্ট ফাইলকে উপেক্ষা করার জন্য ব্যবহৃত হয়। ফাইলটির বিষয়বস্তু প্রাসঙ্গিক নয়।
1615903

1
গীত ডকুমেন্টেশন বিশেষভাবে ব্যবহার করবেন বলে git update-index --skip-worktreeএই কাজের জন্য।
bk2204

43

সাধারণ অনুশীলনটি মনে হয় এটি তৈরি করে devtargets.default.rbএবং এটি প্রতিশ্রুতিবদ্ধ এবং তারপরে প্রতিটি ব্যবহারকারীকে সেই ফাইলটি devtargets.rb(যা .gitignore তালিকায় রয়েছে) অনুলিপি করতে নির্দেশ দেয় । উদাহরণস্বরূপ, কেকপিএইচপি তার ডাটাবেস কনফিগারেশন ফাইলের জন্য একই কাজ করে যা প্রাকৃতিকভাবে মেশিন থেকে মেশিনে পরিবর্তিত হয়।


6
আপনি ট্র্যাক করা একটি ফাইল .gitignore করতে পারবেন না। .gitignore কেবলমাত্র সেই ফাইলগুলির জন্য প্রভাব ফেলে যা সূচকগুলিতে নেই।
সিবি বেইলি

1
আমি এটি করা এড়াতে চেষ্টা করছিলাম, যদিও আমার সত্যিকারের কোনও ভাল কারণ নেই। আমরা এখন এটি করছি এবং আমার মনে হয় যে এটি "বেদনা" নামে আমার নিজের সংস্করণটি তৈরি করা দরকার মনে করার জন্য এটি একটি ব্যথা।
ডেরিক বেইলি

11
@ ডেরিকবাইলি তবে ন্যায্যরূপে --assume-unchanged, সংগ্রহস্থলটিকে ক্লোন করে এমন প্রত্যেকের বিকল্পটি মনে রাখার চেয়ে ফাইলটি অনুলিপি করা মনে রাখা সহজ ।
ড্যান

1
@ ডেরিকবেইলি আপনি নিজের রেক বিল্ডটি ডিফল্ট হিসাবে সেট করতে না পারলে সেট করতে devtargets.default.rbপারেন devtargets.rb
লুক

@erjang- কে সেই ডিভটারজেটস.ডিফফল.আরবি ফাইলের মধ্যে কী আছে? একটি উদাহরণ?
মিমি

2

ইন্টেলিজ আইডিইএ ব্যবহারকারীদের জন্য: আপনি যদি কোনও ফাইল (বা ফাইল) এর পরিবর্তনগুলি উপেক্ষা করতে চান তবে আপনি এটিকে অন্যটিতে স্থানান্তর করতে পারেন Change Set

  • হাতে হেড Local Changes( Cmd + 9)
  • আপনি যে ফাইল (গুলি) উপেক্ষা করতে চান তা নির্বাচন করুন
  • F6 তাদের অন্যে স্থানান্তরিত করতে Change Set
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.