如何使用 Git 跟踪单个文件的版本



假设我有一个文件foo.txt,我想用Git管理,我不想把它移到它自己的目录中(比方说)/Users/me/Documents,其中还有大量其他文件,我不想包含在foo.txt的存储库中。 这可能吗?

我尝试创建一个裸存储库(因此它不会被命名为 .git):

git init --bare .foo.txt

并计划通过在 info/exclude 文件中放置这样的东西来排除除 foo 以外的所有内容.txt:

*
!foo.txt

但是我遇到的问题是我什至无法进行git status,因为似乎无法传递 .git 目录的非标准替代品。

使用普通的 .git 目录是行不通的,因为它会限制我对那个文件进行版本控制,或者强迫我在同一存储库中包含任何其他文件,并且我希望能够在自己的存储库中对该目录中的其他文件进行版本控制。

我意识到这不是 Git 设计的用例,但由于它是我已经熟悉的强大工具,如果有办法做到这一点,我宁愿使用它而不是其他东西。

如果您首先初始化文件的 git 存储库,则可以完全按照自己的意愿进行操作:

git init --bare .foo.txt

然后像这样运行 git:

git --git-dir=.foo.txt --work-tree=. status

别名第二个命令的第一部分git-foo,你就可以开始比赛了。

如何使用 .gitignore 文件创建应编辑的文件的过滤器。此解决方案避免了窗口不支持的硬链接。

例如以下文件:

$ cat .gitignore
*
!data.xml

将 git 配置为忽略除"data.xml"之外的所有文件。

我认为最好的选择是在单独的目录中创建一个存储库,并在其中为要包含的每个文件创建一个硬链接:

mkdir some_repo
cd some_repo
git init
ln path/to/file file
# add & commit

对我来说,跟踪存储在单独目录中的存储库中的单个文件最方便。

创建一个目录来存储 git 存储库

mkdir my-repo-path

转到工作树目录(所需文件所在的位置)

cd my-worktree-path

在隐藏的子目录内初始化一个单独的存储库.git my-repo-path

git init --separate-git-dir my-repo-path.git

除了单独的存储库外,git 还在 worktree 目录中创建了一个隐藏文件.git。如果您愿意,可以删除它(如果您要在某些单独的存储库中单独跟踪工作树目录中的其他一些文件,这可能会很有用)。

del /AH .git

在任何文本编辑器中,打开文件my-repo-path.gitinfoexclude并在末尾添加以下行(其中foo.txt是您要跟踪的文件):

*
!foo.txt

在命令提示符下,转到 git 存储库并添加将提交的内容。

cd my-repo-path.git
git add .
git commit

添加远程源和推送主分支,向其添加上游(跟踪)引用。

git remote add origin <url>
git push -u origin master

之后,您将从 git 存储库目录中添加以下提交(请参阅倒数第二步)。

最新更新