উত্স নিয়ন্ত্রণে রাখার জন্য টিপস


77

আমি আমার হোম ডিরেক্টরি (~) উত্স নিয়ন্ত্রণের মধ্যে রাখতে চাই (এই ক্ষেত্রে) এবং গিটে এগুলি রাখা তাদের পুনরুদ্ধারের জন্য সুন্দর করে তোলে।

আমার প্রধান মেশিনটি আমার ম্যাকবুক এবং ওএস এক্স যেভাবে সেট আপ হয়েছে সেখানে অনেকগুলি ফোল্ডার রয়েছে যা আমি উপেক্ষা করতে চাই (ডকুমেন্টস, ডাউনলোডস, এসএসএস)) এছাড়াও ফোল্ডারগুলি রয়েছে যা ইতিমধ্যে গিট (.emacs.d) ব্যবহার করছে।

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

এটি করার কোনও পরিষ্কার উপায় নেই?


আপনি যে ফোল্ডারগুলি চান তা করার জন্য একটি স্ক্রিপ্ট তৈরি করতে এবং ক্রোনজবসের মাধ্যমে কল করতে পারেন।
শাদোক

নোট করুন যে ম্যাক ওএস এক্স-এ ডিফল্ট এইচএফএস + ফাইল সিস্টেমটি কেস-সংবেদনশীল (তবে কেস-সংরক্ষণ করা) এবং সেই ফাইল পাথগুলি ব্যবহারকারীর স্পষ্টে ক্যানোনিজড ইউটিএফ -8 এ এনকোড করা আছে! আরও তথ্যের জন্য দেখুন: <a href=" stackoverflow.com/questions/5581857/... ও Mac OS X</a> উপর অভিশ্রুতি সমস্যা

উত্তর:


60

আমি $HOMEগিট অধীনে আছে । আমার .gitignore ফাইলের প্রথম লাইনটি

/*

বাকিগুলি !পরিবর্তক ব্যবহার করে উপেক্ষা না করার প্যাটার্নগুলি । এই প্রথম লাইনটির অর্থ ডিফল্ট হ'ল আমার হোম ডিরেক্টরিতে থাকা সমস্ত ফাইল উপেক্ষা করা। আমি যে ফাইলগুলিকে সংস্করণ নিয়ন্ত্রণ করতে .gitignoreচাই সেগুলি এর মধ্যে চলে যায় :

!/.gitignore
!/.profile
[...]

আমার কাছে একটি কৌশলযুক্ত প্যাটার্নটি হ'ল:

!/.ssh
/.ssh/*
!/.ssh/config

এটি, আমি কেবল সংস্করণ চাই .ssh/config- আমি চাই না আমার কী এবং অন্যান্য ফাইলগুলিতে গিটে যেতে ss উপরেরটি কীভাবে আমি তা অর্জন করি।

সম্পাদনা করুন: সমস্ত পথের শুরুতে স্ল্যাশ যুক্ত করা হয়েছে। এটি উপেক্ষা প্যাটার্নগুলি কোথাও পরিবর্তে সংগ্রহস্থল (OME HOME) এর শীর্ষ থেকে মিলছে। উদাহরণস্বরূপ, যদি !lib/কোনও প্যাটার্ন হয় (lib ডিরেক্টরিতে সমস্ত কিছু উপেক্ষা করবেন না) এবং আপনি একটি ফাইল যুক্ত করেন .gitignore, পূর্বে প্যাটার্নটি ( !.gitignore) এর সাথে মেলে। শীর্ষস্থানীয় স্ল্যাশ ( !/.gitignore) এর সাথে এটি কেবলমাত্র .gitignoreআমার হোম ডিরেক্টরিতে মেলে এবং কোনও সাব-ডিরেক্টরিতে নয়।

আমি এমন কোনও মামলা দেখিনি যেখানে এটি আমার উপেক্ষা তালিকার সাথে ব্যবহারিক পার্থক্য তৈরি করে, তবে এটি আমার কাছে আরও প্রযুক্তিগতভাবে সঠিক বলে মনে হয়।


1
আমার কাছে মনে হচ্ছে এটি আরও সহজ উপায়ে অর্জন করা যায় ।
নিক ভলিনকিন

24

আমি কি (একই উদ্দেশ্য সঙ্গে) কি করে সাব আমার কনফিগারেশন ফাইল করা হয় ~/lib, এবং আমার home ডিরেক্টরিতে যেমন মধ্যে সিম্বলিক লিঙ্ক আছে .emacs -> lib/emacs/dot.emacs। আমি কেবল কনফিগারেশন ফাইল রাখি যা আমি স্পষ্টভাবে সংস্করণ নিয়ন্ত্রণের অধীনে লিখেছি; আমার হোম ডিরেক্টরিতে স্বয়ংক্রিয়ভাবে তৈরি ডট ফাইল রয়েছে যা সংস্করণ নিয়ন্ত্রণে নেই। এইভাবে ~/libসংস্করণ নিয়ন্ত্রণে রয়েছে, এবং আমার হোম ডিরেক্টরিটি নেই।

আমার কাছে একটি স্ক্রিপ্ট রয়েছে যা নীচের ফাইলগুলি থেকে প্রতীকী লিঙ্কগুলি তৈরি করে ~/lib। আমি যখন একটি নতুন মেশিনে অ্যাকাউন্ট তৈরি করি, তখন আমি ~/libস্ক্রিপ্টটি পরীক্ষা করে চালিয়ে এটিকে জনপ্রিয় করি ।

আমার অভিজ্ঞতা সিভিএসের সাথে রয়েছে, গিট নয়, সুতরাং এটি 100% স্থানান্তরযোগ্য নয়। আমি নিজের হোম ডিরেক্টরিটি সরাসরি সিভিএসের আওতায় না রাখার একটি কারণ হ'ল এটি ~/.cvsignoreকেবলমাত্র আমার হোম ডিরেক্টরি নয়, আমার সমস্ত সিভিএস চেকআউটগুলির জন্য প্রযোজ্য; গিটের এই সমস্যা নেই। সংস্করণ নিয়ন্ত্রণের আওতায় হোম ডিরেক্টরি থাকার সাথে তুলনা করে এই পদ্ধতির ক্ষয়ক্ষতিটি হ'ল আপনি git statusযে ফাইলটিকে স্পষ্টভাবে উপেক্ষা করার সিদ্ধান্ত নিয়েছেন তার মধ্যে পার্থক্য করতে পারবেন না (যা উপেক্ষা করা ফাইলের মধ্যে তালিকাবদ্ধ থাকবে, সুতরাং প্রদর্শিত হবে না) এবং একটি ফাইল যা সম্পর্কে আপনার কোনও মতামত নেই (যা এটির সাথে প্রদর্শিত হবে ?)।

কিছু ফাইল বিভিন্ন মেশিনে পৃথক হওয়া প্রয়োজন। আমি তাদের ডাকা একটি ডিরেক্টরিতে রেখেছি ~/Local/SITENAME/libএবং হয় তাদের জন্য প্রতীকী লিঙ্কগুলিও তৈরি করি বা (এটি সমর্থন করে এমন ফাইল ফর্ম্যাটগুলির জন্য) এর নীচে ফাইলটিতে অন্তর্ভুক্ত নির্দেশিকা রয়েছে ~/lib। আমারও একটি প্রতীকী লিঙ্ক আছে ~/Here -> ~/Local/SITENAME। যেহেতু গিট, সিভিএসের বিপরীতে, বেশিরভাগ-অনুরূপ-তবে-নয়-অভিন্ন সংগ্রহস্থলগুলি সমর্থন করার জন্য ডিজাইন করা হয়েছে, তাই মেশিন-নির্দিষ্ট ফাইলগুলি পরিচালনা করার আরও ভাল উপায় থাকতে পারে। আমার কয়েকটি ডট ফাইল আসলে প্রতীকী লিঙ্ক নয়, তবে স্বয়ংক্রিয়ভাবে ~/libএবং এর অধীনে থাকা সামগ্রী থেকে তৈরি হয়েছিল ~/Here


হতে পারে আপনার কাছে কোর.এক্সক্লুডস ফাইল = ~/.gitignore। এই জাতীয় কনফিগারেশন না থাকলে ফাইলটি কোনও স্টোরের মধ্যে সংরক্ষণ করা ব্যতীত কোনও সংগ্রহস্থলের জন্য প্রয়োগ করা হয় না ~/.git(তারপরেও এটি সাব-রেপোজিটরিগুলিতে প্রযোজ্য হবে না)। আমি আমার সমস্ত গিট সংগ্রহস্থলগুলিতে (অবস্থান নির্বিশেষে) প্রয়োগ করতে চাই এবং আমার হোম ডিরেক্টরিতে থাকা (কিছু অংশ) রেপোজিটরিতে প্রয়োগ করতে চাইলে বাদ দেওয়াগুলির~/.git-user-excludes মধ্যে দ্বন্দ্ব এড়াতে আমি কোর.এক্সক্লুডসফিল = ব্যবহার করি
ক্রিস জনসেন

@ ক্রিস: গিট সম্পর্কে আমি খুব কমই জানি। gitignoreম্যান পৃষ্ঠায় এই বাক্যটি আমি ভুল বুঝেছি : "প্যাট্রিন্টগুলি .gitignore ফাইল থেকে পথ হিসাবে একই ডিরেক্টরিতে বা কোনও প্যারেন্ট ডিরেক্টরিতে (…) পড়েছে" এটি কি চেকআউটের মূলের দিকে থামে (যেমন যেখানে .gitডিরেক্টরি হয়)?
গিলস

1
হ্যাঁ, .gitignoreফাইলগুলির জন্য searchর্ধ্বমুখী অনুসন্ধান কার্যকারী গাছের মূল দ্বারা আবদ্ধ। আপনার উদ্ধৃত বাক্যটি অব্যাহত রয়েছে: "(কাজের গাছের শীর্ষ স্তরের অবধি)"।
ক্রিস জনসেন

@ ক্রিস: ম্যান পেজের আমার সংস্করণে এই শব্দগুলি নেই - মনে হচ্ছে শব্দটি পরিষ্কার হয়ে গেছে। আমি আমার উত্তর সংশোধন করেছি। ধন্যবাদ!
গিলস

এটি সম্প্রতি
আড্ডায়

11

ফাইলগুলি তালিকাভুক্ত থাকলেও আমরা ট্র্যাকিং চালিয়ে যেতে গিটের ক্ষমতা ব্যবহার করতে পারি .gitignore। সুতরাং, এটি যথেষ্ট .gitignore:

$ cat .gitignore
/*

প্রতিটি ফাইল আপনি ট্র্যাক করতে চান তাদের জন্য, চালানোর add -f( -fপ্যারামিটার উভয় উপেক্ষা ওভাররাইড .gitignoreএবং .git/info/exclude):

git add -f .gitignore
git add -f .profile
git add -f .zshrc
git add -f .ssh/config

একবার কোনও ফাইলকে সূচিবদ্ধ করার পরে, ফাইলটি উপেক্ষা করা সত্ত্বেও গিট সমস্ত পরিবর্তনগুলি সনাক্ত করবে। একই ডিরেক্টরিতে কাজ করে তবে কেবলমাত্র উপস্থিত ফাইলগুলির জন্য:

git add -f somedirname

আপনি যদি উপস্থিত সমস্ত নতুন ফাইলের সাথে একটি সম্পূর্ণ ডিরেক্টরি ট্র্যাক করতে চান তবে ক্যামের উত্তরে.gitignore বর্ণিত এটি কোনও উপায়ে বাদ দেওয়া যেতে পারে :

!/somedirname

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

git rm --cached .ssh/config

1
আমি যদি আমার পয়েন্ট দিতে পারি আমি পারতাম। যদি লক্ষ্য করা উচিত যে এই পদ্ধতিটি কেবল ফাইলগুলি ট্র্যাক করতে ব্যবহার করা যেতে পারে ডিরেক্টরিগুলি নয়। আপনি যদি কোনও ডিরেক্টরিতে সমস্ত ফাইলের গিট ট্র্যাক করতে চান তবে আপনাকে এখনও .gitignore এ সেই ডিরেক্টরিটি উপেক্ষা করতে হবে। অন্যথায় ডিরেক্টরিতে নতুন ফাইল নতুন ফাইল হিসাবে উপস্থিত হবে না।
ক্যামহ

5

আমি তার জন্য পুরানোটি rcsব্যবহার করি।

জন্য manpages কটাক্ষপাত আছে ci, coএবং rcs। এই সাইটগুলি পাশাপাশি সহায়ক হতে হবে:

আমি উদাহরণস্বরূপ আমার ডটফিলগুলি নিয়ন্ত্রণ করে সংস্করণে এটি ব্যবহার করি:

ci -u .*vimrc

এবং যদি আমি এগুলি সম্পাদনা করতে চাই:

co -l .*vimrc

RCSআপনার নামের একটি ডিরেক্টরি তৈরি করার পরামর্শ দিই ~, আপনি সহজেই সেই ডিরেক্টরিটি কোথাও কোথাও ব্যাকআপ করতে পারবেন।


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

1
হ্যাঁ, আমি জানি এটি তারিখযুক্ত। প্রশ্নটি কীভাবে করা যায় তার একটি টিপসের জন্য ছিল। আমি এই লোকটিকে কেবল বলেছি যে আমি কীভাবে বহু, বহু বছর ধরে এটি করছি ("তারিখ", ইঙ্গিত, ইঙ্গিত)। এটি এটি করার একমাত্র যুক্তিযুক্ত উপায় হিসাবে বোঝানো হয়নি।
পোলেমন

5

আমি আমার কনফিগারেশন ফাইলগুলি $HOME/.conf/একটি বিটবাকেট মার্চুরিয়াল সংগ্রহস্থল থেকে পরীক্ষা করে দেখি । একটি গিটহাব রেপো ঠিক তেমনি কাজ করবে।

~/.confচেকআউট কনফিগ ফাইল এবং symlinks পূরণ করতে একটি শেল স্ক্রিপ্ট রয়েছে $HOMEপ্রতিটি ফাইলে ~/.conf। যে অন্তর্ভুক্তি সমর্থন (কনফিগ ফরম্যাটের জন্য .bashrc, .inputrc, .vimrc, ইত্যাদি) আমি অন্তর্ভুক্ত ~/.confযাতে আমি স্থানীয় ওভাররাইড করতে পারেন, ফাইল বদলে এটি লিঙ্ক।

কিছু কনফিগার ফাইলের জন্য আমি আমার ড্রপবক্স ফোল্ডারের একটি ফাইলে সিলেট করি এবং ড্রপবক্সের মাধ্যমে ভাগ করি।

কয়েক মাস ধরে আমি $HOMEনিজেকে সংস্করণ নিয়ন্ত্রণে রাখার চেষ্টা করেছি , তবে আমি প্রচুর উপেক্ষা করা তালিকাগুলি পরিচালনা করতে করতে ক্লান্ত হয়েছি, অ্যাপ্লিকেশনগুলি চালিয়ে কনফিগার পরিবর্তনগুলি পরীক্ষা করে দেখে ক্লান্ত হয়ে পড়েছিলাম এবং ফলাফলটি অন্য কোনও কম্পিউটারে পরীক্ষা করে দেখতে চাইলেও এমন কিছু ছিল না। আপনি কি ডেস্কটপ অ্যাপ্লিকেশনগুলির পৃথক সংস্করণ ~/.gconfবা সংঘাতের সমাধানের কল্পনা করতে পারেন ~/.config/monitors.xml?

আমি ব্যক্তিগতভাবে কাস্টমাইজড কনফিগার করা ফাইলগুলির একটি সীমিত তালিকাতে সিমিলিং করা বা অন্তর্ভুক্ত করা সহজ বলে মনে করি এবং বিশ্বব্যাপী ডিফল্ট হিসাবে মেশিনে ভাগ করতে চাই।


3

আমি নীচের পাইথন ডটফিলস স্ক্রিপ্টটি ব্যবহার শুরু করেছি, এটি একটি সহজ সরঞ্জাম যা আপনার জন্য ফাইলগুলি স্বয়ংক্রিয়ভাবে লিঙ্ক করে: https://pypi.python.org/pypi/dotfiles


1

আমি মনে করি উত্স নিয়ন্ত্রণে নন-সম্পর্কিত ফোল্ডারটি রাখার জন্য আপনার দ্বিতীয় হান্চ ভাল।

সেখানে কেবল দুটি শেল স্ক্রিপ্ট যুক্ত করুন। একটি আপনার নিয়ন্ত্রণে থাকা ফাইলগুলিতে অনুলিপি করা ~এবং অন্যটি থেকে ফাইল সংগ্রহ করা ~এবং এটি উত্স-নিয়ন্ত্রিত ফোল্ডারে আবার অনুলিপি করা এবং প্রতিশ্রুতিবদ্ধ।


0

এখানে একটি ছোট রুবি স্ক্রিপ্ট যা আমি একটি নতুন মেশিন সেটআপ করতে ব্যবহার করি

#!/usr/bin/env ruby
# setup.rb

#list of dirs which you don't want to symlink
ignored = %w(.gitignore .gitmodules misc setup.rb readme)

current_dir = File.expand_path(Dir.pwd)
home_dir = File.expand_path("~")

links = `git ls-tree --name-only HEAD`.lines.map(&:strip).select {|x| !ignored.include?(x)  }

links.each do |link|
  link = File.join(current_dir, link)
  symlink = File.join(home_dir, File.basename(link))
  `ln -ns #{link} #{symlink}`
end
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.