Да, вам просто нужно сказать Git, что вы делаете, это отличается от обычной настройки, вы поставили необычные биты, но это просто.
Git не требует хранилища или его рабочего дерева, чтобы быть где-то в конкретном месте. У него есть свои обычные способы их поиска, если вы не указываете это явно, но говорите, что хотите историю для этих двух подкаталогов вашего домашнего каталога. Для одноразовых предложений, как правило, проще указать Git на детали с помощью параметров команды, а когда вы много делаете, проще передать его переопределению из среды. Итак:
myrepo=~/d123-d45-archive
git init --bare "$myrepo"
GIT_WORK_TREE=~ git -C "$myrepo" add dir1/dir2/dir3 dir4/dir5
GIT_WORK_TREE=~ git -C "$myrepo" commit -m 'Initial commit of dir1/dir2/dir3 and dir4/dir5'
Теперь: за пределами этого пустого хранилища нет никаких указаний на то, что Git получил данные отслеживания для некоторого содержимого вашего домашнего каталога, поэтому, когда вы хотите работать с ним, вы должны сообщить Git, где находятся эти фрагменты. Эквивалент аргумента GIT_WORK_TREE
, указанный выше, равен --work-tree ~
, эквивалент среды -C "$myrepo"
равен GIT_DIR=$myrepo
, если вы их пакетируете, это проще сделать, например,
( export GIT_DIR=$myrepo GIT_WORK_TREE=~
git add dir1/dir2/dir3 dir4/dir5
git commit -m 'new snapshot'
)
Есть много способов сделать это удобным, вы можете добавить псевдоним git, чтобы автоматически использовать эту пару
git config --global alias.homedir \!'git -C ~/d123-d45-archive --work-tree ~'
и тогда вы можете, например, git homedir diff
. Чтобы настроить репо так, чтобы рефлексив git add .
не добавлял все автоматически, проще всего будет
mkdir info
printf >info/exclude %s\\n '*' '!*/' '!dir1/dir2/dir3/**' '!dir4/dir5/**'
в этом репо. Вы можете иметь несколько репозиториев, отслеживающих разные или даже перекрывающиеся части любого дерева таким образом - это означает, что вы сами должны отслеживать все фрагменты, быть немного осторожнее.
Обратите внимание, что явное указание Git на контекст, подобный этому, обходит все проверки разумного контекста, Git обычно только делает разумные вещи для файловой системы. Вы находитесь на «достаточно разумной» территории, люди будут делать такие вещи, например, чтобы отслеживать каталог /etc
без необходимости когда-либо касаться самого каталога /etc
, это просто и полезно, но ошибочный clean
может не опустошайте неотслеживаемые части /etc
, потому что вы не можете, не по ошибке. Это не относится к вашему домашнему каталогу.
В какой-то момент вы захотите настроить репо для отслеживания ваших git-специфичных точечных файлов. Это, возможно, совершенно правильный способ сделать это: -)