下面的示例被简化以显示问题的核心,而不是问题本身(我的文件树比这更复杂)。
假设我有两个文件要备份;一个在~/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 存储库也应该是安全的,但我没有详细检查......