如何使用git备份多个目录中的文件?

Mat*_*ock 7 backup git

下面的示例被简化以显示问题的核心,而不是问题本身(我的文件树比这更复杂)。

假设我有两个文件要备份;一个在~/somedir/otherdir,另一个在~/otherdir/somedir/。我想从一个 git 存储库中的两个目录备份文件。我怎样才能做到这一点?软链接只携带有关文件存储位置的信息,而不是实际文件,而硬链接对我来说有点陌生。这是应该使用硬链接的情况吗?

说明:我想使用git有四个原因:我想存储文本文件的点文件/脚本/配置并跟踪随时间的变化,我知道 git,我有一个私有的 git 存储库可以用来存储它们,以及我希望能够在多台 PC 之间共享这些文件。

Ste*_*itt 10

如果您不介意移动文件...

您可以通过将文件移动到 git 存储库并将它们符号链接到它们的旧位置来做到这一点;你最终会得到

  • ~/gitrepo/somedir/otherdir/file1~/somedir/otherdir/file1
  • ~/gitrepo/otherdir/somedir/file2~/otherdir/somedir/file2
  • ~/somedir/otherdir/file1到的符号链接~/gitrepo/somedir/otherdir/file1
  • ~/otherdir/somedir/file2到的符号链接~/gitrepo/otherdir/somedir/file2

然后,您可以安全地提交 git 存储库中的文件,并使用 git 操作它们,使用旧文件路径的任何内容都将看到 git 工作区中的当前内容。以相反的方式链接文件或使用硬链接会很危险,因为任何重写文件的 git 操作(更改分支、恢复到以前的版本......)都会破坏链接。(希望这可以解释为什么硬链接不是真正可行的解决方案。)

在这种情况下,您必须小心完全重写文件、破坏链接的程序;许多文本编辑器都这样做,诸如sed -i等工具也是如此。更安全的方法是将整个文件夹移动到 git 存储库中,并符号链接目录。

如果您想保留文件...

另一种可能性是在您的主目录中创建一个 git 存储库,告诉 git 忽略所有内容,然后强行添加您想要跟踪的文件:

cd
git init
echo '*' > .gitignore
git add -f .gitignore
git commit -m "Initialise repository and ignore everything"
git add -f somedir/otherdir/file1
git commit -m "Add file1"
git add -f otherdir/somedir/file2
git commit -m "Add file2"
Run Code Online (Sandbox Code Playgroud)

完成此操作后,您将能够轻松跟踪对明确添加的文件的更改,但 git 不会考虑新文件。有了这个设置,在你的主目录的子目录中拥有其他 git 存储库也应该是安全的,但我没有详细检查......