mec*_*ynx 2 git backup symlink cross-platform hardlink
我想使用 git 作为备份和记录我在桌面上使用的软件的配置文件的更改历史记录的方法。这将是本地安装了 git 的本地存储库。
然而我不确定这些:
是否可以将文件添加到存储库,就好像它位于与真实路径不同的路径中一样?
我担心的是,如果我天真地添加文件,通过将它们复制到存储库并更新存储库,我最终会为每个文件使用双倍的空间。虽然它不会占用太多空间,但我仍然更喜欢更干净的解决方案。我已经调查过
git-add,git-mv但git-filter-branch他们似乎没有为此提供一个干净的解决方案。add和机制都mv可以用来完成这个任务,但并不能真正解决复制文件的问题。filter-branch对于这项任务来说,锤子似乎太大了。
添加文件后是否可以更改文件路径?
git-filter-branch似乎能够做到这一点,但我不确定副作用。
假设 git 无法满足我明确需要的功能,符号链接或硬链接是否可以避免复制文件的需要?这可以跨平台工作吗?或者 git 在不同平台上处理链接的方式不同吗?
2017 年编辑 - 接受了我得到的答案,因为现在我更好地了解了 git,我意识到没有比复制文件或在祖父母目录中拥有 git 存储库更好的解决方案了。这样做的不优雅意味着复制文件是最佳解决方案,而符号链接/硬链接与此问题无关。这些评论和答案可能对寻找类似但不相同的东西的人有用,所以我鼓励检查这些内容。
从评论中的讨论我得出结论,问题确实是:
在一个大目录层次结构(我的完整主目录)中,我想将选定的文件(配置文件)置于 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
Run Code Online (Sandbox Code Playgroud)
我在现实生活中从未这样做过,但从示例来看它似乎有效。但是,当您的目录树中有其他 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
Run Code Online (Sandbox Code Playgroud)
再说一次,我在现实生活中没有这样做过,硬链接总是有陷阱。程序可能会取消链接其现有配置文件并创建一个具有相同名称的新配置文件,而不是更新现有配置文件(实际上这可能是一种很好的实现,因为它有助于避免配置文件损坏)。因此,您需要一个脚本来检查所有配置文件是否仍然是硬链接的。由于您无法硬链接目录,因此您需要一个在配置目录中搜索新配置文件的脚本。我不知道 git 在结帐时的具体行为如何。因此,在使用 git 修改(例如恢复)硬链接备份文件之前,请确保您有另一级别的备份。除非您真正知道自己在做什么,否则不要在生产系统上尝试此操作。
| 归档时间: |
|
| 查看次数: |
2376 次 |
| 最近记录: |