我应该 git mv 还是只 mv 我正在从另一个目录中挑选/变基的文件?
Should I git mv or just mv the files I'm cherry-picking / rebasing from another directory?
我有一些 csv
文件我会定期修改,它们实际上不包含任何敏感信息,它们只是用作程序的导入,我会根据要求修改它们。
最近我发现了一种处理更改的更有效方法,但我在项目外的临时 git 存储库上对其进行了测试。
由于这是成功的,我现在想 git cherry-pick
range of changes 到它,所以首先我将临时 git 存储库添加为我的项目的远程。
# In my project I added a remote of the test repo with
# a copy of the csv's in the HEAD of my main project.
git remote add tempchanges <path-to-test-repo>
# Created a new branch in my project to test this out in.
git checkout -b new/9_30_2019
# Cherry-picked the changes from the remote test repo, but they ended up in the root of the project.
git cherry-pick <start-commit-in-test-repo>..<head-commit-in-test-repo>
# Started a rebase
git rebase -i <start-commit-in-test-repo>~1
# (`edit`ed each commit in the rebase)
(事后看来,我认为这是一个错误,我应该在现有项目中切掉另一个分支,但我跑题了)
临时存储库只有一个 master 分支,所有内容都在项目的根目录中完成了一系列提交。
当我 cherry-pick
更改到我的项目和本地分支时, csv
文件最终都在我项目的根目录中,但它们属于 src/csv
文件,所以我决定从提交范围的开始(减去 1 次提交)开始进行交互式 rebase
并编辑每个,以便更改显示在我的项目存储库中的 src/csv
目录而不是根目录。
但我的问题是,如果我想这样做,我应该使用 git mv
移动文件还是只使用标准的 bash mv
命令然后重新应用每个随着 rebase 的变化,将相应的提交消息添加到临时项目。
到目前为止,我已经尝试 git mv -f
在第一次提交时移动文件,而在 运行 git rebase --continue
之前我提交它们时甚至没有提到更改.
我还应该做些什么来使这个过程更顺利,我假设我应该使用 mv
而不是 git mv -f
,因为更改似乎是这样显示的在提交之前。
我还想保留提交消息,而不必从旧存储库的日志中复制它们。
git mv
没什么神奇的。 Git 不记住重命名,而是从文件的内容中推导出它们。您可以使用 git mv
,也可以使用 mv
,然后 git add
您的更改。
git mv some.csv src/some.csv
相当于
mv some.csv src/some.csv
git add some.csv src/some.csv
"add" 删除的文件有点奇怪。您正在 "adding" 对暂存区进行更改,此更改恰好是删除文件。
您所做的更改,将文件移动到子目录,可以使用 git filter-branch
一次性完成。
git filter-branch --index-filter 'git mv *.csv src/' <range of changes>
我有一些 csv
文件我会定期修改,它们实际上不包含任何敏感信息,它们只是用作程序的导入,我会根据要求修改它们。
最近我发现了一种处理更改的更有效方法,但我在项目外的临时 git 存储库上对其进行了测试。
由于这是成功的,我现在想 git cherry-pick
range of changes 到它,所以首先我将临时 git 存储库添加为我的项目的远程。
# In my project I added a remote of the test repo with
# a copy of the csv's in the HEAD of my main project.
git remote add tempchanges <path-to-test-repo>
# Created a new branch in my project to test this out in.
git checkout -b new/9_30_2019
# Cherry-picked the changes from the remote test repo, but they ended up in the root of the project.
git cherry-pick <start-commit-in-test-repo>..<head-commit-in-test-repo>
# Started a rebase
git rebase -i <start-commit-in-test-repo>~1
# (`edit`ed each commit in the rebase)
(事后看来,我认为这是一个错误,我应该在现有项目中切掉另一个分支,但我跑题了)
临时存储库只有一个 master 分支,所有内容都在项目的根目录中完成了一系列提交。
当我 cherry-pick
更改到我的项目和本地分支时, csv
文件最终都在我项目的根目录中,但它们属于 src/csv
文件,所以我决定从提交范围的开始(减去 1 次提交)开始进行交互式 rebase
并编辑每个,以便更改显示在我的项目存储库中的 src/csv
目录而不是根目录。
但我的问题是,如果我想这样做,我应该使用 git mv
移动文件还是只使用标准的 bash mv
命令然后重新应用每个随着 rebase 的变化,将相应的提交消息添加到临时项目。
到目前为止,我已经尝试 git mv -f
在第一次提交时移动文件,而在 运行 git rebase --continue
之前我提交它们时甚至没有提到更改.
我还应该做些什么来使这个过程更顺利,我假设我应该使用 mv
而不是 git mv -f
,因为更改似乎是这样显示的在提交之前。
我还想保留提交消息,而不必从旧存储库的日志中复制它们。
git mv
没什么神奇的。 Git 不记住重命名,而是从文件的内容中推导出它们。您可以使用 git mv
,也可以使用 mv
,然后 git add
您的更改。
git mv some.csv src/some.csv
相当于
mv some.csv src/some.csv
git add some.csv src/some.csv
"add" 删除的文件有点奇怪。您正在 "adding" 对暂存区进行更改,此更改恰好是删除文件。
您所做的更改,将文件移动到子目录,可以使用 git filter-branch
一次性完成。
git filter-branch --index-filter 'git mv *.csv src/' <range of changes>