Dan*_*ain 76 settings git version-control
我想将我的主目录 (~) 置于源代码管理之下(在本例中为 git),因为我有许多设置文件(.gitconfig、.gitignore、.emacs 等),我想在其中跨机器携带,将它们放在 Git 中会更方便检索它们。
我的主要机器是我的 MacBook,OS X 的设置方式,有很多我想忽略的文件夹(文档、下载、.ssh)。还有一些文件夹已经在使用 Git (.emacs.d)。
我的想法是将所有这些目录添加到我的 .gitignore 文件中,但这似乎有点令人厌烦,并且可能会导致一些无法预料的后果。我的下一个想法是定期将我想要存储的文件复制到家中的某个文件夹中,然后提交该文件夹。问题在于我必须记住在提交之前移动它们。
有没有干净的方法来做到这一点?
cam*_*amh 60
我$HOME
在git下。我的 .gitignore 文件的第一行是
/*
Run Code Online (Sandbox Code Playgroud)
其余的是使用!
修饰符不能忽略的模式。第一行表示默认设置是忽略主目录中的所有文件。我想要版本控制的那些文件是.gitignore
这样的:
!/.gitignore
!/.profile
[...]
Run Code Online (Sandbox Code Playgroud)
我有一个更棘手的模式是:
!/.ssh
/.ssh/*
!/.ssh/config
Run Code Online (Sandbox Code Playgroud)
也就是说,我只想版本.ssh/config
- 我不希望 .ssh 中的密钥和其他文件进入 git。以上是我如何实现的。
编辑:在所有路径的开头添加了斜杠。这使得忽略模式从存储库的顶部 ($HOME) 而不是任何地方匹配。例如,如果!lib/
是一个模式(不要忽略 lib 目录中的所有内容)并且您添加了一个 file .gitignore
,则之前模式 ( !.gitignore
) 与该模式匹配。使用前导斜杠 ( !/.gitignore
),它只会.gitignore
在我的主目录中匹配,而不会在任何子目录中匹配。
我还没有看到这对我的忽略列表产生实际影响的情况,但在我看来它在技术上更准确。
Gil*_*il' 24
我所做的(具有相同的目标)是将我的配置文件放在一个子目录中,~/lib
并在我的主目录中有符号链接,例如.emacs -> lib/emacs/dot.emacs
. 我只保留我在版本控制下明确编写的配置文件;我的主目录包含大量不受版本控制的自动创建的点文件。因此~/lib
在版本控制之下,而我的主目录不在。
我有一个脚本,可以从~/lib
. 当我在一台新机器上创建一个帐户时,我通过检出~/lib
并运行该脚本来填充它。
我的经验是使用 CVS,而不是 git,所以它不是 100% 可转移的。我没有将我的主目录直接放在 CVS 下的原因之一是它~/.cvsignore
适用于我所有的 CVS 检出,而不仅仅是我的主目录;git没有这个问题。与将主目录置于版本控制之下相比,这种方法的缺点是您无法git status
区分已明确决定忽略的文件(将在忽略文件中列出,因此不会显示)和您没有意见的文件(将显示为?
)。
有些文件在不同的机器上需要不同。我将它们放在一个名为的目录中,~/Local/SITENAME/lib
并为它们创建符号链接,或者(对于支持它的文件格式)在~/lib
. 我也有一个符号链接~/Here -> ~/Local/SITENAME
。由于 git 与 CVS 不同,它旨在支持大多数相似但不相同的存储库,因此可能有更好的方法来管理特定于机器的文件。我的一些点文件实际上不是符号链接,而是根据~/lib
和下的内容自动生成的~/Here
。
小智 10
我们可以使用 Git 的功能来继续跟踪文件,即使它们在.gitignore
. 所以,这足以满足.gitignore
:
$ cat .gitignore
/*
Run Code Online (Sandbox Code Playgroud)
对于要跟踪的每个文件,运行add -f
(-f
参数覆盖忽略 in.gitignore
和.git/info/exclude
):
git add -f .gitignore
git add -f .profile
git add -f .zshrc
git add -f .ssh/config
Run Code Online (Sandbox Code Playgroud)
一旦为文件建立索引,Git 将跟踪所有更改,尽管该文件被忽略。这同样适用于目录,但仅适用于实际存在的文件:
git add -f somedirname
Run Code Online (Sandbox Code Playgroud)
如果要跟踪包含所有新文件的整个目录,可以通过.gitignore
某种方式将其排除在外,如camh的回答所述:
!/somedirname
Run Code Online (Sandbox Code Playgroud)
如果你想停止跟踪一个文件,这个命令会从 Git 的索引中删除一个文件,但在硬盘驱动器上保持它不变:
git rm --cached .ssh/config
Run Code Online (Sandbox Code Playgroud)
我$HOME/.conf/
从 BitBucket Mercurial 存储库中检出我的配置文件。GitHub 存储库也能正常工作。
该~/.conf
结账包含配置文件和一个shell脚本来填充符号链接中$HOME
,以每个文件~/.conf
。对于支持包含(.bashrc
、.inputrc
、.vimrc
等)的配置格式,我包含~/.conf
文件而不是链接到它,以便我可以进行本地覆盖。
对于某些配置文件,我符号链接到我的 Dropbox 文件夹中的文件并通过 dropbox 共享。
几个月来,我尝试将$HOME
自己置于版本控制中,但我厌倦了管理大量的忽略列表,厌倦了检查运行应用程序所做的配置更改,结果甚至不想在另一台计算机上检查。你能想象解决~/.gconf
或 的冲突~/.config/monitors.xml
,或迎合不同版本的桌面应用程序吗?
我发现符号链接或包含我个人自定义并希望作为全局默认值跨机器共享的有限配置文件列表更容易。