Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将更改提交到本地Repo,而不使用Git将更改推送到远程Repo_Git - Fatal编程技术网

如何将更改提交到本地Repo,而不使用Git将更改推送到远程Repo

如何将更改提交到本地Repo,而不使用Git将更改推送到远程Repo,git,Git,在我的Git存储库中,我有一个需要包含工作目录位置的文件。这对于克隆存储库的每个人来说都是不同的,并且这个特定文件对于每个用户都有正确的(唯一的)目录,这一点很重要。除唯一文件路径外,文件的大部分内容对于所有用户都是通用的 请注意,我们不能为每个用户维护不同的文件(Git中的唯一文件名或文件位置),因为我们的工具会搜索特定的文件位置和文件名 目前我们解决这个问题的方法是更新文件路径,使其指向我们的工作目录,然后我们再也不会提交这个更新。我们将其作为本地更改保留,当我们拉取或合并分支时,我们隐藏该

在我的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
当然,我刚刚为
git commit
编写了
--local only
选项,但我希望有人知道类似的事情。我已经检查了Google和Stack Overflow,但似乎没有人问过类似的问题


编辑:到目前为止,提出的大多数建议都与非基于Git的解决方案有关(例如符号链接)。我最初想要一个如上所述的基于Git的解决方案,因为它可以解决我的问题,同时还考虑到一些我还没有提到的其他约束。让我在这里列举其他限制条件,以便在我们试图提出解决方案时考虑到它们

  • 该工具不属于我或我的团队,因此我们无法更改其行为
  • 每个Git克隆都需要对应一个唯一的目录。也就是说,它不能是由多个用户共享的公共克隆
  • 所有用户共享相同的文件系统,因此使用固定目录将违反限制(2)
  • 每个用户ID可能对应多个Git克隆,因此我们不能将克隆设置为目录(或符号链接),在主目录中使用固定名称,因为这样每个用户ID只允许一个Git克隆
  • 该工具无法展开环境变量以获取文件路径
  • 文件路径必须在此特定文件中。无法包含另一个包含路径的文件
  • 这个文件应该在Git中跟踪,这样我们就可以对文件的内容进行版本控制(除了包含文件路径的那一行)
  • 该工具从工作目录之外的符号链接访问文件。这意味着我们不能使用相对文件路径,因为该工具最终将查看相对于符号链接的路径,而不是查看相对于工作目录中实际文件的路径
  • 解决方案将需要由多人实施,因此解决方案需要相对简单、简单和无痛。例如,期望每个人创建多个用户ID,并在他们想要切换任务时在它们之间切换,这太复杂了
  • 在我们的Git存储库中有很多这样的文件,因此如果我们能够找到一个解决方案,而不需要为每个文件进行额外的人工操作,那将是非常理想的
  • 恐怕你真正想要的解决方案并不存在。我建议您再看看您排除的一些解决方案,并找出如何使它们发挥作用

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

    您推回“工具以某种方式工作”,但这假设工具的输入必须与您从
    git checkout
    中获得的完全一致;这似乎不太可能

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

    但是,要建立一个我真的认为会在你最不经意的时候崩溃并导致奇怪问题的东西,需要做很多工作;而且这似乎不太可能是必要的

    在git中,跟踪文件是跟踪文件;它的变化总是共享的。因此,找到一种方法来分离局部变化(这不能被跟踪)