gpt4 book ai didi

git - 使用git备份配置文件

转载 作者:行者123 更新时间:2023-12-02 04:18:37 26 4
gpt4 key购买 nike

我想使用 git 作为备份和保存我在桌面上使用的软件的配置文件的更改历史记录的方法。这将是本地安装了 git 的本地存储库。

但是我不确定这些:

  • 是否可以将文件添加到存储库,就好像它位于与实际路径不同的路径中?

    My concern is that if I add files naively, by copying them to the repository and updating the repo, I'd end up using double the space for each file. While it isn't going to be a lot of space, I would still prefer a cleaner solution. I've looked into git-add, git-mv and git-filter-branch but they don't seem to provide a clean solution to this. Both add and mv mechanics can be used to accomplish this task, but don't really get around the problem of duplicating files. filter-branch seems way too big of a hammer for this task.

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

    git-filter-branch seems capable of doing this, but I'm unsure of the side-effects.

  • 假设 git 无法满足我明确需要的功能,符号链接(symbolic link)或硬链接(hard link)是否可以避免复制文件的需要?这可以跨平台工作吗?或者 git 在不同平台上处理链接的方式不同吗?

在 2017 年编辑 - 接受了我得到的答案,因为现在我更好地了解了 git,我意识到没有比复制文件或在祖 parent 目录中拥有 git 存储库更好的解决方案了。这样做的不优雅意味着复制文件是最佳解决方案,而符号链接(symbolic link)/硬链接(hard link)与此问题无关。这些评论和答案可能对寻找类似但不相同的东西的人有用,所以我鼓励检查这些内容。

最佳答案

根据评论中的讨论,我得出的结论是,问题确实是:

在一个大的目录层次结构(我的完整主目录)中,我想将选定的文件(配置文件)置于 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 文件系统,则可以使用硬链接(hard link)。在某处为您的备份创建一个 git 存储库,并为所有配置文件添加硬链接(hard link)。

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

#! /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

再说一次,我在现实生活中没有这样做过,硬链接(hard link)总是有陷阱。程序可能会取消链接其现有配置文件并创建一个具有相同名称的新配置文件,而不是更新现有配置文件(实际上这可能是一种很好的实现,因为它有助于避免配置文件损坏)。因此,您需要一个脚本来检查所有配置文件是否仍然是硬链接(hard link)的。由于您无法硬链接(hard link)目录,因此您需要一个在配置目录中搜索新配置文件的脚本。我不知道 git 在 checkout 时的具体行为如何。因此,在使用 git 修改(例如恢复)硬链接(hard link)备份文件之前,请确保您有另一级别的备份。除非您真正知道自己在做什么,否则不要在生产系统上尝试此操作。

关于git - 使用git备份配置文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31941975/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com