如何在没有变化的情况下改变本地回购利用Git进行远程回购

时间:2018-05-21 15:55:11

标签: git

在我的Git存储库中,我有一个文件需要包含我的工作目录的位置。对于克隆存储库的每个人而言,这将有所不同,并且此特定文件对于每个用户具有正确(唯一)目录非常重要。除了唯一的文件路径之外,大多数文件的内容对所有用户都是通用的。

请注意,由于我们的工具会搜索特定的文件位置和文件名,因此我们无法为每个用户维护不同的文件(Git中的唯一文件名或文件位置)。

我们目前解决这个问题的方法是更新文件路径以指向我们的工作目录,然后我们永远不会提交此更新。我们将其作为本地更改,当我们拉动或合并分支时,我们会隐藏本地更改以避免任何冲突。拉/合并完成后,我们会弹出存储。这是一个示例工作流,我们将局部更改提交到一个分支(例如功能分支),然后将这些更改合并到另一个分支(例如主分支)。我们将所有更改都推送到两个分支,我们使用git stashgit 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的解决方案,如上所述,因为它可以解决我的问题,同时还解决了我还没有提到的其他一些约束。让我列举其他约束,以便在我们尝试提出解决方案时考虑它们。

  1. 该工具不归我或我的团队所有,因此我们无法改变其行为。
  2. 每个Git克隆需要对应一个唯一的目录。也就是说,它不能是多个用户共享的常见克隆。
  3. 所有用户共享相同的文件系统,因此使用固定目录会违反限制(2)。
  4. 每个用户ID可能对应多个Git克隆,因此我们无法将我们的克隆设置为目录(或符号链接),在我们的主目录中具有固定名称,因为每个用户只允许一个Git克隆ID。
  5. 该工具无法扩展环境变量以获取文件路径。
  6. 文件路径必须位于此特定文件中。我们不能包含另一个包含路径的文件。
  7. 应该在Git中跟踪 这个文件,以便我们可以对文件内容进行版本控制(除了包含文件路径的一行)。
  8. 该工具从存在于工作目录之外的符号链接访问该文件。这意味着我们不能使用相对文件路径,因为该工具最终会查看相对于符号链接的路径,而不是查看相对于工作目录中实际文件的路径。
  9. 解决方案需要由多人实施,因此解决方案需要相对简单,简单且无痛。例如,期望每个人创建多个用户ID并在他们想要切换任务时在他们之间切换太复杂了。
  10. 我们的Git存储库中有很多这样的文件,所以如果我们找到一个不需要为每个文件做额外的人力工作的解决方案,那将是理想的。

1 个答案:

答案 0 :(得分:1)

你真正想要的解决方案并不完全存在,我很害怕。我建议你再看看你已经排除的一些解决方案,并弄清楚如何让它们发挥作用。

推送到原点的提交根本不能包含因主机而异的文件。它们可以包含模板。它们可以包含占位符。它们可以包含用于从环境生成文件的脚本。

你推迟了那个"该工具以某种方式工作"但是假设工具的输入必须与git checkout完全相同;这似乎不太可能。

我认为该工具本身可以通过调用git checkout来构建工作树,然后在做出荒谬的假设之前不会给你任何修改工作树的机会,即它收到的文件是针对该机器进行本地化的。在这种情况下,我猜你可以设置一个涂抹过滤器(通过git属性),它会在结账过程中注入本地值(取自环境,或者在repo之外的特定位置的本地文件,或其他)。 (相应的清理过滤器必须确保取回本地值。)这需要大量特定于项目的自定义脚本,因此除了概述上述想法之外,我无法提供更多细节。

但是,要设置一些我真诚希望会破坏并在你最不期望的时候引起奇怪问题的东西,我需要付出很多努力。它似乎不太可能是必要的。

在git中,跟踪文件是跟踪文件;它的变化始终是共享的。因此,找到一种方法将局部变量(可以在跟踪文件中进行分离)与全局共享变更(可以)进行分离,并弄清楚如何使您的工具与之集成。

顺便说一句,我预测有人会建议使用索引的skip-worktree和/或assume-unchanged标志。这是个坏主意。不是那些标志的用途,需要手动设置每个回购,并且迟早会引起错误。