使用git备份配置文件



我想使用git来备份和保存我在桌面上使用的软件配置文件的更改历史。这是一个本地存储库,在本地安装git。

然而,我不确定这些:

  • 是否有可能将文件添加到存储库,就像它在不同的路径中一样?

    我担心的是,如果我天真地添加文件,通过将它们复制到存储库并更新repo,我最终会为每个文件使用两倍的空间。虽然它不会占用很多空间,但我仍然希望有一个更干净的解决方案。我已经研究了git-add, git-mvgit-filter-branch,但它们似乎没有提供一个干净的解决方案。addmv机制都可以用来完成这个任务,但是并不能真正解决文件复制的问题。filter-branch对于这个任务来说似乎太大了。

  • 是否可以更改文件添加后的路径?

    git-filter-branch似乎能够做到这一点,但我不确定副作用。

  • 符号链接或硬链接是否可以绕过复制文件的需要,假设git不具备我明确需要的功能?这会跨平台工作吗,或者git在不同平台上处理链接的方式不同?

edit in 2017 -接受我得到的答案,因为现在我对git有了更好的了解,我意识到没有比复制文件或在祖父目录下拥有git repo更好的解决方案了。这意味着复制文件是最佳解决方案,而符号链接/硬链接与此问题无关。这些评论和答案可能对那些寻找相似但不相同的东西的人有用,所以我鼓励他们看看。

从评论中的讨论中我得出结论,这个问题实际上是:

在一个大的目录层次结构(我的完整的主目录)中,我想把选定的文件(配置文件)放在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 repos时,可能需要将它们作为子模块包含。子模块有各种各样的陷阱,所以最后可能会变得相当棘手。

2)。您没有提到您使用的是哪个文件系统。如果您使用的是Linux文件系统,则可以使用硬链接。为你的备份创建一个git repo,并为所有配置文件添加硬链接。

这个演示脚本展示了这个想法:

#! /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修改(例如恢复)硬链接的备份文件之前,请确保您有另一个级别的备份。除非您真的知道自己在做什么,否则不要在生产系统上尝试。

最新更新