我想使用git作为备份的方法,并且具有我在桌面上使用的软件配置文件的更改历史记录。这将是一个本地安装git的本地存储库。
但我不确定这些:
是否可以将文件添加到存储库,就好像它的路径与实际路径不同?
我担心的是,如果我天真地添加文件,通过将它们复制到存储库并更新存储库,我最终会为每个文件使用两倍的空间。虽然它不会占用太多空间,但我仍然更喜欢更清洁的解决方案。我调查了
git-add
,git-mv
和git-filter-branch
但他们似乎没有为此提供一个干净的解决方案。add
和mv
两种机制都可用于完成此任务,但并未真正解决重复文件的问题。filter-branch
对于这项任务来说似乎太过分了。
添加文件后是否可以更改文件的路径?
git-filter-branch
似乎能够做到这一点,但我不确定副作用。
符号链接或硬链接是否可以避免复制文件的需要,假设git不能满足我的需要?这可以跨平台工作,还是git在不同平台上处理不同的链接?
2017年编辑 - 接受了我得到的答案,因为现在我更好地理解了git,我意识到没有比复制文件或只是在祖父目录中使用git repo更好的解决方案。它的优点是,复制文件是最佳解决方案,符号链接/硬链接与此问题无关。评论和回答可能对寻找类似但不相同的人有用,所以我鼓励检查这些。
答案 0 :(得分:2)
从评论中的讨论中我得出结论,问题确实是:
在一个大目录层次结构(我的完整主目录)中,我想将所选文件(配置文件)放在git版本控制下,而大多数其他文件(“普通”文件)不在版本控制中。
我从未这样做过,但我想到了两个选择:
1。)使整个目录层次结构成为一个git工作区域,但是通过使用.gitignore规则排除所有文件,除非明确包含它们。因此,您需要列出配置目录或文件以使其受版本控制。
这是一个构建小型示例目录层次结构的演示脚本。除了明确包含的配置目录/文件外,所有内容都被排除在git版本控制之外(您可以从名称中猜出它们是哪些。)
#! /bin/sh
time=$(date +%H-%M-%S)
mkdir example-$time
cd example-$time
touch a b c
touch conf1
mkdir d1
touch d1/a
touch d1/b
touch d1/conf
mkdir d2
touch d2/f1
touch d2/f2
mkdir conf-d
touch conf-d/conf1
touch conf-d/conf2
git init
cat >.gitignore <<EOF
# ignore all files
*
# but not directories (if a directory is once ignored, git will never
# look what is inside)
!*/
# of course .gitignore must never be ignored
!.gitignore
# list configuration files
!conf1
EOF
cat >d1/.gitignore <<EOF
# list the configuration files in this "mixed" directory
!conf
EOF
cat >conf-d/.gitignore <<EOF
# this is a configuration directory, include everthing...
!*
# ... but ignore editor backup files
*~
EOF
git add -A
git status
我从未在现实生活中做过这件事,但从这个例子来看它似乎有效。但是,当您在目录树中有其他git存储库时,您可能需要将它们包含为子模块。存在与子模块相关的各种陷阱,因此最终可能会变得非常棘手。
2。)你没有提到你所使用的文件系统。如果您使用的是Linux文件系统,则可以使用硬链接。在某处为您的备份创建一个git仓库,并为所有配置文件添加硬链接。
此演示脚本显示了这个想法:
#! /bin/sh
time=$(date +%H-%M-%S)
mkdir hl-example-$time
cd hl-example-$time
touch a b c
touch conf1
mkdir d1
touch d1/a
touch d1/b
touch d1/conf
mkdir d2
touch d2/f1
touch d2/f2
mkdir conf-d
touch conf-d/conf1
touch conf-d/conf2
mkdir hl-backup
cd hl-backup
git init
ln ../conf1 .
mkdir d1
ln ../d1/conf d1
mkdir conf-d
ln ../conf-d/* conf-d
git add -A
git status
同样,我在现实生活中没有这样做过,而且硬链接总是有陷阱。程序可以取消链接其现有配置文件并创建一个具有相同名称的新配置文件,而不是更新现有配置文件(实际上这可能是一个很好的实现,因为它有助于避免损坏的配置文件)。因此,您需要一个脚本来检查所有配置文件是否仍然是硬链接的。并且因为您无法硬链接目录,所以您需要一个在配置目录中搜索新配置文件的脚本。我不知道git在结账时的表现如何。因此,在让git修改(例如恢复)硬链接备份文件之前,请确保您有另一级别的备份。除非你真的知道自己在做什么,否则不要在生产系统上尝试这个。