7

我想要在我的本地 git 存储库中跟踪的文件在我运行 git-svn dcommit 时不会签入到中央 svn 存储库。我经常对存储库中跟踪的文件进行长期的仅限本地更改。有时它用于调试代码。我也有想要跟踪的项目 IDE 文件。使用普通的旧 svn,我只需将这些文件放入标有“XYZ:请勿签入”的更改列表中,然后当我确实需要提交更改时手动处理问题。

理想情况下,我想将我的更改检查到我的主分支中,但设置一些东西来防止这些特定更改传播到 svn 存储库。我会以传统方式使用 git 和 git-svn,但某些提交永远不会被推送。显然,我可以在每次提交时手动执行此操作,但这很痛苦。

我考虑并放弃了几件事。我不想排除这些文件,因为有时我需要进行更改才能提交。另外,我希望这些文件出现在我创建的任何本地分支中,就像 IDE 文件一样。但是,我不能将这些更改隔离到单个分支,因为我希望它们出现在每个分支中,就像 IDE 文件一样。看起来像 guilt 或 stgit 之类的东西可能会做我想做的事,但这并不明显,因为它们在 git 之上添加了自己的复杂层,我仍在学习。

4

5 回答 5

2

我对 git 有点陌生,但我建议在本地 git 存储库中使用单独的主分支和工作分支。

仅将“非 SVN”文件添加到工作分支中。通常在工作分支中进行所有代码更改。当“非SVN”文件发生变化时,使用唯一提交添加那些,并设置提交消息前缀(即“本地:”或“私有:”)。当您准备好提交到 SVN 时:

  1. 显示要添加到 SVN 的提交日志:

    git co working
    git cherry master
    
  2. 将所有上游提交添加到主分支,忽略“私有”提交。重复此步骤,直到所有上游提交都在 master 中。

    git co master
    git cherry-pick <SHA1>
    
  3. 将提交推送到 SVN 存储库:

    git svn rebase
    git svn dcommit
    
于 2009-03-11T23:56:19.133 回答
2

我目前对该问题的解决方案是使用堆叠的 git (stg) 并将这些本地更改作为单独的补丁进行维护。当我需要 dcommit 到 Subversion 时,我会执行

stg pop # naming the patches that should not be commited
stg commit # the rest of the patches to commit
git svn dcommit
stg push # naming the patches that are used locally

将这些作为单独的补丁进行维护的好处是,我可以轻松地使用补丁来修改我的单元测试以测试不同的数据库后端。所以通常我会针对 Oracle 进行测试,但如果我想针对 Derby 进行测试,我会这样做

stg push local-mods-derby
ant tests
stg pop

或者如果我想针对 PostgreSQL 进行测试,我运行

stg push local-mods-test-postgresql
ant tests
stg pop

这里,“local-mods-derby”和“local-mods-test-postgresql”是补丁名称。

因此,使用 stg 维护单独的工作补丁非常容易。

于 2009-03-24T19:07:02.697 回答
1

您是否考虑过不在 master 分支工作?

如果您将更改保存在本地 git 分支中,您可以定期将所需的更改合并或挑选到您的 svn 跟踪分支中。切换到跟踪分支,运行 dcommit。然后回到你的本地分支并重新设置它。

如果您希望在多个分支中进行更改,请将它们全部基于同一个分支点。通过变基将该分支保持为主+更改。然后对于所有其他分支,只需从该基础分支重新设置基准即可。

于 2009-03-27T17:24:23.233 回答
0

您可能需要考虑为此使用 stash。

git-stash - Stash the changes in a dirty working directory away

但是,对于您所描述的内容,它可能功能不足。

于 2009-03-11T20:59:48.840 回答
0

我做了一些研究并想出了一个可以做到的可能性:2个git存储库指向同一个目录。环境变量 GIT_DIR 存储本地存储库目录的名称。如果未设置,git 默认为 .git,但它可以是任何东西。

然后我可以做的是在 .git 中有一个存储库,它映射到我的 Subversion 存储库。这是常见的情况。然后我可以在 .localgit 中有另一个存储库。每个存储库都必须配置为忽略另一个存储库管理的文件。这很容易!用于否定模式。

当我对要签入的仅限本地文件进行更改时,我要么更改我的 GIT_DIR 环境变量,要么使用 --git-dir 命令行参数。如果我的排除/忽略设置正确,我就不必担心碰撞。显然有一些开销来保持最新,但我可以编写一个包装脚本,当文件添加到另一个时,将文件添加到一个 repo 的排除。此外,这种开销只在每个文件中发生一次,而不是像多分支建议那样在每次提交时发生。

如果我想让它更简单,我可以使用命名约定,但我也可以在每个单独的文件上这样做,因为本地文件的数量几乎肯定是个位数(否则我做错了什么)。

我看到这种方法的一个缺点是我无法像 SVN 存储库中的文件一样分支、存储和重置仅本地文件。不过,我对这些的修改可能与我的主要编辑是异步的,所以我认为这在实践中不会是一个重大问题。我还可以为那些支持多存储库的函数编写包装器。此外,在管理仅限本地的文件时,我必须更加明确,但几乎任何情况都必须处理这个问题,除非 git 本身内置多个存储库。

于 2009-03-16T20:42:10.587 回答