在我的Git存储库中,我有一个文件需要包含我的工作目录的位置。对于克隆存储库的每个人而言,这将有所不同,并且此特定文件对于每个用户具有正确(唯一)目录非常重要。除了唯一的文件路径之外,大多数文件的内容对所有用户都是通用的。
请注意,由于我们的工具会搜索特定的文件位置和文件名,因此我们无法为每个用户维护不同的文件(Git中的唯一文件名或文件位置)。
我们目前解决这个问题的方法是更新文件路径以指向我们的工作目录,然后我们永远不会提交此更新。我们将其作为本地更改,当我们拉动或合并分支时,我们会隐藏本地更改以避免任何冲突。拉/合并完成后,我们会弹出存储。这是一个示例工作流,我们将局部更改提交到一个分支(例如功能分支),然后将这些更改合并到另一个分支(例如主分支)。我们将所有更改都推送到两个分支,我们使用git stash
和git stash pop
来隐藏此过程中的本地更改。
// starting in branch named "original_branch"
git commit // our other changes that we do want to share with others
git stash // stash the one file with the updated user directory
git pull
git push
git checkout another_branch
git pull
git merge original_branch
git push
git stash pop
对我来说,这只是一个小麻烦,因为上面的工作流程很好。但是,由于我与团队合作,这样的解决方案最终导致错误,然后我需要花时间帮助人们解决冲突和其他Git问题,而不是做我的实际工作。如果我能够以某种方式让每个用户将带有更新文件路径的文件版本提交到他们的本地存储库中,而不会在推送其他更改时将更改发送到远程存储库,那将是理想的。这似乎不太可能,但我希望有人知道这里的解决方案。
这就是我想象的解决方案看起来像:
vim special_file.txt // update just that one line in special_file.txt
git commit --local-only -- special_file.txt
git commit -- some_other_file.txt
git push // only pushes the update for some_other_file.txt
当然,我只为--local-only
编制了git commit
选项,但我希望有人知道类似的东西。我检查了谷歌和Stack Overflow,但似乎没有人问过类似的问题。
编辑到目前为止,大多数提出的建议都与基于Git的解决方案(例如符号链接)有关。我原本想要一个基于Git的解决方案,如上所述,因为它可以解决我的问题,同时还解决了我还没有提到的其他一些约束。让我列举其他约束,以便在我们尝试提出解决方案时考虑它们。
答案 0 :(得分:1)
你真正想要的解决方案并不完全存在,我很害怕。我建议你再看看你已经排除的一些解决方案,并弄清楚如何让它们发挥作用。
推送到原点的提交根本不能包含因主机而异的文件。它们可以包含模板。它们可以包含占位符。它们可以包含用于从环境生成文件的脚本。
你推迟了那个"该工具以某种方式工作"但是假设工具的输入必须与git checkout
完全相同;这似乎不太可能。
我认为该工具本身可以通过调用git checkout
来构建工作树,然后在做出荒谬的假设之前不会给你任何修改工作树的机会,即它收到的文件是针对该机器进行本地化的。在这种情况下,我猜你可以设置一个涂抹过滤器(通过git属性),它会在结账过程中注入本地值(取自环境,或者在repo之外的特定位置的本地文件,或其他)。 (相应的清理过滤器必须确保取回本地值。)这需要大量特定于项目的自定义脚本,因此除了概述上述想法之外,我无法提供更多细节。
但是,要设置一些我真诚希望会破坏并在你最不期望的时候引起奇怪问题的东西,我需要付出很多努力。它似乎不太可能是必要的。
在git中,跟踪文件是跟踪文件;它的变化始终是共享的。因此,找到一种方法将局部变量(可以在跟踪文件中进行分离)与全局共享变更(可以)进行分离,并弄清楚如何使您的工具与之集成。
顺便说一句,我预测有人会建议使用索引的skip-worktree
和/或assume-unchanged
标志。这是个坏主意。不是那些标志的用途,需要手动设置每个回购,并且迟早会引起错误。