Поради щодо передачі ~ під контроль джерела


77

Я хочу поставити свій домашній каталог (~) під контроль джерела (git, в даному випадку), оскільки у мене є багато файлів налаштування (.gitconfig, .gitignore, .emacs тощо), які я хотів би перенести через машини, і мати їх у Git було б приємно для їх отримання.

Моя основна машина - мій MacBook, і спосіб налаштування OS X - це багато папок, які я хочу ігнорувати (Документи, Завантаження, .ssh). Також є папки, які вже використовують Git (.emacs.d).

Моя думка полягала в тому, щоб просто додати всі ці каталоги до мого файлу .gitignore, але це видається стомлюючим і може призвести до непередбачуваних наслідків. Наступною моєю думкою було періодично копіювати файли, які я хочу зберегти в якусь папку вдома, а потім зробити цю папку. Проблема з цим полягатиме в тому, що я маю пам’ятати, щоб перемістити їх, перш ніж здійснити.

Чи є чистий спосіб це зробити?


Ви також можете зробити сценарій, виконуючи коміти потрібних папок і викликаючи його через кронштейни.
Шадок

Зауважте, що файлова система HFS + за замовчуванням у Mac OS X нечутлива до регістру (але зберігає регістр) і шляхи до файлів кодуються в канонічно розкладеному UTF-8 у просторі користувача! Для отримання додаткової інформації див: <a href=" stackoverflow.com/questions/5581857/… та проблема Umlaut у Mac OS X</a>

Відповіді:


60

У мене $HOMEпід git. Перший рядок мого файлу .gitignore - це

/*

Решта - це моделі, які не можна ігнорувати за допомогою !модифікатора. Цей перший рядок означає, що за замовчуванням є ігнорування всіх файлів у моєму домашньому каталозі. Ті файли, якими я хочу керувати версіями, переходять .gitignoreтак:

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

Більш складний візерунок у мене:

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

Тобто я хочу лише версію .ssh/config- я не хочу, щоб мої ключі та інші файли в .ssh переходили в git. Сказане - як я цього домагаюся.

Редагувати: Додано косої риски для початку всіх контурів. Це змушує ігнорувати шаблони вгорі сховища ($ HOME) замість будь-якого місця. Наприклад, якщо !lib/був шаблон (не ігноруйте все в каталозі lib) і ви додаєте файл .gitignore, раніше шаблон ( !.gitignore) відповідав цьому. З провідним косою косою рисою ( !/.gitignore) вона збігатиметься лише .gitignoreв моєму домашньому каталозі, а не в будь-яких підкаталогах.

Я не бачив жодного випадку, коли це могло би змінити практичний зміст у моєму списку ігнорування, але мені здається, що він є більш технічно точним.


1
Мені здається, що того ж можна досягти набагато простіше .
Нік Волинкін

24

Що мені робити ? (З тими ж цілями), щоб помістити мої файли конфігурації в підкаталозі ~/libі мають символічні посилання в моїй домашній директорії, наприклад, .emacs -> lib/emacs/dot.emacs. Я зберігаю лише файли конфігурації, які я написав явно під контролем версій; мій домашній каталог містить безліч автоматично створених точкових файлів, які не знаходяться під контролем версій. Таким чином, ~/libзнаходиться під контролем версій, а мій домашній каталог - ні.

У мене є сценарій, який створює символічні посилання з файлів під ~/lib. Коли я створюю обліковий запис на новій машині, я заповнюю його, перевіряючи ~/libта запускаючи цей сценарій.

Мій досвід стосується CVS, а не git, тому він не є 100% переданим. Однією з причин, що я не ставлю свій домашній каталог безпосередньо під CVS, є те, ~/.cvsignoreщо стосується всіх моїх квитанцій CVS, а не лише мого домашнього каталогу; git не має цієї проблеми. Мінус цього підходу порівняно з тим, що домашній каталог знаходиться під контролем версій, полягає в тому, що ви не можете використовувати git statusдля розрізнення файлу, який ви явно вирішили проігнорувати (який буде вказаний у файлі ігнорування, так що не відображається) та файл, про який ви не маєте думки (який відображатиметься з а ?).

Деякі файли мають бути різними на різних машинах. Я поміщую їх у каталог, який називається, ~/Local/SITENAME/libабо створюю символічні посилання також для них, або (для форматів файлів, які його підтримують) має директиву включення у файл під ~/lib. У мене також є символічне посилання ~/Here -> ~/Local/SITENAME. Оскільки git, на відміну від CVS, призначений для підтримки схожих схожих, але не ідентичних сховищ, може бути кращий спосіб керувати файлами, характерними для машини. Кілька моїх точкових файлів насправді не є символічними посиланнями, але автоматично генеруються із вмісту під ~/libта під ~/Here.


Можливо, у вас є core.excludesfile = ~/.gitignore. Без такої конфігурації файл не застосовується до жодного сховища, крім одного, що зберігається в ньому ~/.git(навіть тоді він не застосовуватиметься до підрепозиторіїв). Я використовую core.excludesfile = ~/.git-user-excludesщоб уникнути конфлікту між виключеннями, які я хочу застосувати до всіх моїх сховищ Git (незалежно від місця розташування) та тими винятками, які я хочу застосувати до сховища, яке містить (частини) мого домашнього каталогу.
Кріс Джонсен

@Chris: Я дуже мало знаю про git. Я, можливо, неправильно зрозумів це речення на gitignoreсторінці чоловіка: "Шаблони читаються з .gitignore-файлу в тому самому каталозі, що і шлях, або в будь-якому батьківському каталозі (...)" Чи справді воно зупиняється в корені каси (тобто де .gitкаталог)?
Жиль

1
Так, пошук вгору .gitignoreфайлів обмежений коренем робочого дерева. Пропозиція, яку ви цитували, продовжує: "(до вершини робочого дерева)".
Кріс Джонсен

@Chris: у моїй версії сторінки man немає цих слів - схоже, формулювання було уточнено. Я виправив свою відповідь. Дякую!
Жиль

про це йшлося в чаті нещодавно
strugee

11

Ми можемо використовувати здатність Git продовжувати відстежувати файли, навіть якщо вони є в списку .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 відстежує всі зміни, незважаючи на те, що файл ігнорується. Те саме працює для каталогу, але лише для файлів, які є фактично присутніми:

git add -f somedirname

Якщо ви хочете відслідковувати весь каталог з усіма новими файлами, що з’являються в ньому, його можна виключити .gitignoreспособом, описаним у відповіді camh :

!/somedirname

Якщо ви хочете зупинити відстеження файлу, ці команди видаляють файл з індексу Git, але залишають його не торканим на жорсткому диску:

git rm --cached .ssh/config

1
Я б дав вам свої бали, якби міг. Якщо слід зазначити, що цей метод можна використовувати лише для відстеження файлів, а не каталогів. Якщо ви хочете, щоб git відстежував усі файли в каталозі, вам все одно доведеться відігнорувати цей каталог у .gitignore. Інакше нові файли в цьому каталозі не з’являться як нові файли.
camh

5

Для цього я використовую старе rcs.

Подивіться на сторінках керівництва для ci, coі rcs. Ці сайти також повинні бути корисними:

Я використовую це для версії, наприклад, керування моїми точками:

ci -u .*vimrc

І якщо я хочу їх відредагувати:

co -l .*vimrc

Я рекомендую створити каталог, названий RCSу вашому ~, потім ви можете легко створити резервну копію цього каталогу десь.


2
rcs зараз досить датований, а git робить все, що робить rcs та багато іншого. Раніше я використовував rcs для будь-якого локального, де не хотів накладних витрат на налаштування сховища на сервері, але я повністю перейшов на git зараз для цього типу використання. Я навіть написав сценарій, який обертає cvs2git для перетворення існуючої ієрархії каталогів з файлами rcs у ній у git.
Ніл Мейхью

1
Так, я знаю, що вона датована. Питання полягало в підказці, як це зробити. Я щойно розповідав цьому хлопцеві, як я це роблю багато-багато років ("датований", підказки, підказки). Це не малося на увазі таким чином, що це єдиний розумний спосіб зробити це.
полемон

5

Я перевіряю свої конфігураційні файли $HOME/.conf/з сховища BitBucket Mercurial. Рідпо GitHub працював би так само добре.

~/.confВиписка містить конфігураційні файли і скрипт для заповнення символьних посилань в $HOMEкожен файл в ~/.conf. Для форматів конфігурації , які підтримують включення ( .bashrc, .inputrc, .vimrcі т.д.) я включаю ~/.confфайл , а не посилання на нього, так що я можу зробити місцеве перевизначення.

Для деяких конфігураційних файлів я посилаюсь на файл у своїй папці Dropbox і надаю спільний доступ через Dropbox.

Деякі місяці я намагався тримати $HOMEсебе в контролі версій, але мені набридло керувати масовими списками ігнорування, мені набридло перевіряти зміни конфігурації, виконані за допомогою додатків, і результат навіть не те, що я хотів би перевірити на іншому комп’ютері. Чи можете ви уявити, як виправляти конфлікти з приводу ~/.gconfабо ~/.config/monitors.xml, чи задовольняти різні версії настільних додатків?

Мені простіше символізувати посилання або включати обмежений список конфігураційних файлів, які я особисто налаштував і хочу поділитися на всіх машинах як глобальні параметри за замовчуванням.


3

Я тільки почав використовувати наступний скрипт Python Dotfiles, який є зручним інструментом, який автоматично посилає файли для вас: https://pypi.python.org/pypi/dotfiles


1

Я думаю, що ваш другий намір мати непов'язану папку під контролем джерела - це добре.

Просто додайте туди 2 сценарії оболонки. Один - копіювати файли під вашим контролем, ~а інший - збирати файли ~та копіювати їх назад у папку, керовану джерелом, та здійснювати фіксацію.


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.