重命名 git 子模块

发布于 2024-10-09 09:56:26 字数 230 浏览 8 评论 0原文

有没有一些简单的方法来重命名 git 子模块目录(除了执行 删除它并使用新的目的地名称重新添加)。

当我们这样做时,为什么我根本无法在父目录中执行以下操作: git mv old-submodule-name new-submodule-name

Is there some easy way to rename a git submodule directory (other than going through the entire motion of deleting it and re-adding it with a new destination name).

And while we are at it, why is it that I simply cannot do the following in the parent directory: git mv old-submodule-name new-submodule-name

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

兰花执着 2024-10-16 09:56:27

编辑 .gitmodules 文件以重命名子模块,然后重命名子模块目录。

我认为您可能需要随后执行 git submodulesync,但我现在无法检查。

Edit the .gitmodules file to rename the submodule and then rename the submodule directory.

I think you might need to do a git submodule sync afterwards, but I'm not in a position to check right now.

药祭#氼 2024-10-16 09:56:27

许多很棒的答案,我最近遇到了这个问题(遇到了一些困难),我想分享我所采取的完整(但最少)步骤列表。

处理具体示例:

存储库 PyShallow ([GitHub] : CristiFati/pyshallow - PyShallow):

  • 取决于 PyCFUtils ([GitHub]:CristiFati/pycfutils - PyCFUtils)并将其作为(Git)子模块:

    • 我最近将其从 CFPyUtils 重命名为(在 GitHub 上)

    • 有一点让我有点偏离方向,那就是旧的 URL(使用旧名称)仍然有效 - GitHub 足够智能,可以重定向到新的(这是有道理的)

  • 我可能被认为太迂腐,但我希望删除所有对CFPyUtils的引用(即使其中一些只是内部的(用户不可见)并且它们可以工作)

步骤 (如果想用替换 - 每个术语都指:路径和(部分) URL):

  1. 重命名 Git 存储库中的子模块文件夹(git mv old new

  2. .gitmodules:编辑和替换出现的所有

  3. .git /config:编辑所有出现的内容并替换为

  4. 重命名(手动)子模块引用文件夹(mv .git/modules/old .git/modules/new

  5. new/.git (!!!这是一个文件!!!):更新新的参考文件夹

  6. 同步子模块(git 子模块同步)

  7. 修改引用旧子模块路径的任何(非 Git 相关)文件

之后在测试克隆以及新克隆上一切正常。

实际步骤:

<代码>(py_pc064_03.10_test0) [cfati@cfati-5510-0:/mnt/e/Work/Dev/Repos/GitHub/CristiFati/pyshallow/src]> ; 〜/ sopr.sh
### 设置较短的提示,以便在粘贴到 StackOverflow(或其他)页面时更好地适应 ###

【064位提示】> # ---------- 从头开始​​ ----------
【064位提示】> LS
【064位提示】>
【064位提示】> git clone [电子邮件受保护]:CristiFati/pyshallow.git 。
克隆到“.”...
远程:枚举对象:123,完成。
远程:计数对象:100% (123/123),完成。
远程:压缩对象:100% (83/83),完成。
远程:总计 123(增量 57),重复使用 92(增量 30),包重复使用 0
接收对象:100% (123/123),18.97 KiB | 626.00 KiB/s,完成。
解决增量:100% (57/57),完成。
【064位提示】>
【064位提示】> LS
目录 LICENSE README.md _extra cfpyutils gen_evt mue_idle.py nix_run.sh win_run.bat
【064位提示】>
【064位提示】> ls cfpyutils/
【064位提示】>
【064位提示】> git 子模块更新 --init
子模块“cfpyutils”([电子邮件受保护]:CristiFati/cfpyutils.git)已注册路径“cfpyutils”
克隆到“/mnt/e/Work/Dev/Repos/GitHub/CristiFati/pyshallow/src/cfpyutils”...
子模块路径“cfpyutils”:签出“46ba9528d3aaed29eeaee5f09ac50c0f28e5836d”
【064位提示】>
【064位提示】> # ---------- 步骤#1。 ----------
【064位提示】> git mv cfpyutils pycfutils
【064位提示】>
【064位提示】> LS
目录 LICENSE README.md _extra gen_evt mue_idle.py nix_run.sh pycfutils win_run.bat
【064位提示】>
【064位提示】> git 状态
在分支主控上
您的分支已更新为“origin/master”。

要提交的更改:
  (使用“git Restore --staged ...”取消暂存)
        修改:.gitmodules
        重命名为:cfpyutils -> pycfutils

【064位提示】>
【064位提示】> git diff --缓存 .gitmodules
diff --git a/.gitmodules b/.gitmodules
索引 a4caf8a..8c841d4 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,5 +1,5 @@
 [子模块“cfpyutils”]
- 路径=cfpyutils
+ 路径 = pycfutils
        url = [电子邮件受保护]:CristiFati/cfpyutils.git
        #url = https://github.com/CristiFati/cfpyutils.git
        分支=主控
【064位提示】>
【064位提示】> # ---------- 步骤#2。 ----------
【064位提示】> vi .gitmodules
【064位提示】>
【064位提示】> # ---------- 步骤#3。 ----------
【064位提示】> vi .git/config
【064位提示】>
【064位提示】> # ---------- 步骤#4。 ----------
【064位提示】> mv .git/modules/cfpyutils .git/modules/pycfutils
【064位提示】>
【064位提示】> git 状态
致命:不是 git 存储库:pycfutils/../.git/modules/cfpyutils
【064位提示】>
【064位提示】> # ---------- 步骤#5。 ----------
【064位提示】> vi pycfutils/.git
【064位提示】>
【064位提示】> # ---------- 步骤#6。 ----------
【064位提示】> git 子模块同步
正在同步“pycfutils”的子模块 url
【064位提示】>
【064位提示】> # ---------- 步骤#7。 ----------
【064位提示】> vi mue_idle.py
【064位提示】>
【064位提示】> # ---------- 全部完成(审核更改、提交并推送) ----------
【064位提示】>
【064位提示】> git 差异
diff --git a/.gitmodules b/.gitmodules
索引 8c841d4..c9be742 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,5 +1,5 @@
-[子模块“cfpyutils”]
+[子模块“pycfutils”]
        路径=pycfutils
- url = [电子邮件受保护]:CristiFati/cfpyutils.git
- #url = https://github.com/CristiFati/cfpyutils.git
- 分支=主控
+ url = [电子邮件受保护]:CristiFati/pycfutils.git
+ #url = https://github.com/CristiFati/pycfutils.git
+ 分支 = 主要
diff --git a/mue_idle.py b/mue_idle.py
索引 60813f9..dc48dc8 100755
---a/mue_idle.py
+++ b/mue_idle.py
@@ -12,8 +12,8 @@ 如果 cur_dir 不在 sys.path 中:
     sys.path.append(cur_dir)
 \"\"\"
 将 gen_evt 导入为 ge
-来自 cfpyutils.common 导入 ts_str
-从cfpyutils.keyboard导入read_key
+来自 pycfutils.common 导入 ts_str
+从 pycfutils.keyboard 导入 read_key


 __版本信息__ = (0, 2, 2)
【064位提示】>
【064位提示】> git 状态
在分支主控上
您的分支已更新为“origin/master”。

要提交的更改:
  (使用“git Restore --staged ...”取消暂存)
        修改:.gitmodules
        重命名为:cfpyutils -> pycfutils

未暂存提交的更改:
  (使用“git add ...”来更新将提交的内容)
  (使用“git Restore ...”放弃工作目录中的更改)
        修改:.gitmodules
        修改:mue_idle.py

【064位提示】> git add .gitmodules mue_idle.py
【064位提示】>
【064位提示】> git commit -m“修复:更新子模块(路径&& url)”
[master 15d21e9] 修复:更新子模块(路径 && url)
 更改了 3 个文件,插入了 8 个(+),删除了 8 个(-)
 重命名 cfpyutils => pycfutils (100%)
【064位提示】> git 推送
枚举对象:7,完成。
计数物体:100%(7/7),完成。
使用最多 8 个线程的增量压缩
压缩对象:100% (4/4),完成。
写入对象:100% (4/4),544 字节 | 24.00 KiB/s,完成。
总计 4 个(增量 2),重复使用 0 个(增量 0)
远程:解析增量:100% (2/2),用 2 个本地对象完成。
到 github.com:CristiFati/pyshallow.git
   7fcf9f3..52b148e 主控->掌握

Many great answers, I recently ran into this issue (had a bit of struggle) and I want to share a complete (yet minimal) list of steps that I took.

Working on a concrete example:

Repository PyShallow ([GitHub]: CristiFati/pyshallow - PyShallow):

  • Depends on PyCFUtils ([GitHub]: CristiFati/pycfutils - PyCFUtils) and has it as a (Git) submodule:

    • I recently renamed it (on GitHub) from CFPyUtils

    • One thing that threw me me a bit off course is that the old URL (with the old name) still works - GitHub is smart enough to redirect to the new one (which makes sense)

  • I might be considered too pedantic, but I wanted all references to CFPyUtils removed (even if some of them are just internal (no visibility to the user) and they work)

Steps (if one wants to replace old by new - each term refers to both: path and (part of) URL):

  1. Rename submodule folder in the Git repository (git mv old new)

  2. .gitmodules: Edit and replace all old occurrences by new

  3. .git/config: Edit and replace all old occurrences by new

  4. Rename (manually) submodule reference folder (mv .git/modules/old .git/modules/new)

  5. new/.git (!!! it's a file !!!): Update the new reference folder

  6. Synchronize submodule (git submodule sync)

  7. Modify any (non Git related) file that references the old submodule path

Everything works fine afterwards on the test clone, and also on a fresh one.

The actual steps:

(py_pc064_03.10_test0) [cfati@cfati-5510-0:/mnt/e/Work/Dev/Repos/GitHub/CristiFati/pyshallow/src]> ~/sopr.sh
### Set shorter prompt to better fit when pasted in StackOverflow (or other) pages ###

[064bit prompt]> # ---------- Start from scratch ----------
[064bit prompt]> ls
[064bit prompt]>
[064bit prompt]> git clone [email protected]:CristiFati/pyshallow.git .
Cloning into '.'...
remote: Enumerating objects: 123, done.
remote: Counting objects: 100% (123/123), done.
remote: Compressing objects: 100% (83/83), done.
remote: Total 123 (delta 57), reused 92 (delta 30), pack-reused 0
Receiving objects: 100% (123/123), 18.97 KiB | 626.00 KiB/s, done.
Resolving deltas: 100% (57/57), done.
[064bit prompt]>
[064bit prompt]> ls
Contents  LICENSE  README.md  _extra  cfpyutils  gen_evt  mue_idle.py  nix_run.sh  win_run.bat
[064bit prompt]>
[064bit prompt]> ls cfpyutils/
[064bit prompt]>
[064bit prompt]> git submodule update --init
Submodule 'cfpyutils' ([email protected]:CristiFati/cfpyutils.git) registered for path 'cfpyutils'
Cloning into '/mnt/e/Work/Dev/Repos/GitHub/CristiFati/pyshallow/src/cfpyutils'...
Submodule path 'cfpyutils': checked out '46ba9528d3aaed29eeaee5f09ac50c0f28e5836d'
[064bit prompt]>
[064bit prompt]> # ---------- Step #1. ----------
[064bit prompt]> git mv cfpyutils pycfutils
[064bit prompt]>
[064bit prompt]> ls
Contents  LICENSE  README.md  _extra  gen_evt  mue_idle.py  nix_run.sh  pycfutils  win_run.bat
[064bit prompt]>
[064bit prompt]> git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   .gitmodules
        renamed:    cfpyutils -> pycfutils

[064bit prompt]>
[064bit prompt]> git diff --cached .gitmodules
diff --git a/.gitmodules b/.gitmodules
index a4caf8a..8c841d4 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,5 +1,5 @@
 [submodule "cfpyutils"]
-       path = cfpyutils
+       path = pycfutils
        url = [email protected]:CristiFati/cfpyutils.git
        #url = https://github.com/CristiFati/cfpyutils.git
        branch = master
[064bit prompt]>
[064bit prompt]> # ---------- Step #2. ----------
[064bit prompt]> vi .gitmodules
[064bit prompt]>
[064bit prompt]> # ---------- Step #3. ----------
[064bit prompt]> vi .git/config
[064bit prompt]>
[064bit prompt]> # ---------- Step #4. ----------
[064bit prompt]> mv .git/modules/cfpyutils .git/modules/pycfutils
[064bit prompt]>
[064bit prompt]> git status
fatal: not a git repository: pycfutils/../.git/modules/cfpyutils
[064bit prompt]>
[064bit prompt]> # ---------- Step #5. ----------
[064bit prompt]> vi pycfutils/.git
[064bit prompt]>
[064bit prompt]> # ---------- Step #6. ----------
[064bit prompt]> git submodule sync
Synchronizing submodule url for 'pycfutils'
[064bit prompt]>
[064bit prompt]> # ---------- Step #7. ----------
[064bit prompt]> vi mue_idle.py
[064bit prompt]>
[064bit prompt]> # ---------- All done (review changes, commit and push) ----------
[064bit prompt]>
[064bit prompt]> git diff
diff --git a/.gitmodules b/.gitmodules
index 8c841d4..c9be742 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,5 +1,5 @@
-[submodule "cfpyutils"]
+[submodule "pycfutils"]
        path = pycfutils
-       url = [email protected]:CristiFati/cfpyutils.git
-       #url = https://github.com/CristiFati/cfpyutils.git
-       branch = master
+       url = [email protected]:CristiFati/pycfutils.git
+       #url = https://github.com/CristiFati/pycfutils.git
+       branch = main
diff --git a/mue_idle.py b/mue_idle.py
index 60813f9..dc48dc8 100755
--- a/mue_idle.py
+++ b/mue_idle.py
@@ -12,8 +12,8 @@ if cur_dir not in sys.path:
     sys.path.append(cur_dir)
 \"\"\"
 import gen_evt as ge
-from cfpyutils.common import ts_str
-from cfpyutils.keyboard import read_key
+from pycfutils.common import ts_str
+from pycfutils.keyboard import read_key


 __version_info__ = (0, 2, 2)
[064bit prompt]>
[064bit prompt]> git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   .gitmodules
        renamed:    cfpyutils -> pycfutils

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   .gitmodules
        modified:   mue_idle.py

[064bit prompt]> git add .gitmodules mue_idle.py
[064bit prompt]>
[064bit prompt]> git commit -m "fix: update submodule (path && url)"
[master 15d21e9] fix: update submodule (path && url)
 3 files changed, 8 insertions(+), 8 deletions(-)
 rename cfpyutils => pycfutils (100%)
[064bit prompt]> git push
Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 8 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 544 bytes | 24.00 KiB/s, done.
Total 4 (delta 2), reused 0 (delta 0)
remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
To github.com:CristiFati/pyshallow.git
   7fcf9f3..52b148e  master -> master
晚雾 2024-10-16 09:56:26

Git1.8.5(2013 年 10 月)应该简化过程。只需做一个:

git mv A B

git mv A B”,当移动子模块A时,已被教导重新定位其工作树并调整中的路径。 gitmodules 文件


更多信息请参见提交 0656781fadca1

当前在子模块上使用“git mv”会将子模块的工作树移动到超级项目的工作树中。但是 .gitmodules 中子模块的路径设置保持不变,它现在与工作树不一致,并使 git 命令依赖于正确的 path -> 。名称映射(如statusdiff)表现得很奇怪。

让“git mv”在这里提供帮助,不仅移动子模块的工作树,而且还更新“submodule..path”设置.gitmodules 文件并暂存两者。
当找不到 .gitmodules 文件时,不会发生这种情况,并且仅在没有此子模块的部分时发出警告。这是因为用户可能只使用没有 .gitmodules 文件的普通 gitlinks,或者在发出“git mv”命令之前已经手动更新了路径设置(在这种情况下,警告会提醒他>mv 会为他做到这一点)。
仅当找到 .gitmodules 且包含合并冲突时,mv 命令才会失败并告诉用户在重试之前解决冲突。


git 2.9(2016 年 6 月)将改进子模块的 git mv:

请参阅commit a127331 (2016 年 4 月 19 日)作者:Stefan Beller (stefanbeller)
(由 Junio C Hamano -- gitster -- 合并于 提交 9cb50a3,2016 年 4 月 29 日)

mv:允许移动嵌套子模块

git mv old new”没有正确调整作为 old/ 目录中的子目录存在的子模块的路径。

但是子模块需要将其链接更新为 git 目录
以及对 .gitmodules 文件的更新。

Git1.8.5 (October 2013) should simplify the process. Simply do a:

git mv A B

"git mv A B", when moving a submodule A has been taught to relocate its working tree and to adjust the paths in the .gitmodules file.


See more in commit 0656781fadca1:

Currently using "git mv" on a submodule moves the submodule's work tree in that of the superproject. But the submodule's path setting in .gitmodules is left untouched, which is now inconsistent with the work tree and makes git commands that rely on the proper path -> name mapping (like status and diff) behave strangely.

Let "git mv" help here by not only moving the submodule's work tree but also updating the "submodule.<submodule name>.path" setting from the .gitmodules file and stage both.
This doesn't happen when no .gitmodules file is found and only issues a warning when it doesn't have a section for this submodule. This is because the user might just use plain gitlinks without the .gitmodules file or has already updated the path setting by hand before issuing the "git mv" command (in which case the warning reminds him that mv would have done that for him).
Only when .gitmodules is found and contains merge conflicts the mv command will fail and tell the user to resolve the conflict before trying again.


git 2.9 (June 2016) will improve git mv for submodule:

See commit a127331 (19 Apr 2016) by Stefan Beller (stefanbeller).
(Merged by Junio C Hamano -- gitster -- in commit 9cb50a3, 29 Apr 2016)

mv: allow moving nested submodules

"git mv old new" did not adjust the path for a submodule that lives as a subdirectory inside old/ directory correctly.

submodules however need to update their link to the git directory as
well as updates to the .gitmodules file.

空名 2024-10-16 09:56:26

我发现以下工作流程有效:

  • Update .gitmodules
  • mv oldpath newpath
  • git rm oldpath
  • git add newpath
  • git submodulesync

注意:此方法无法在 2018 版本的 GIT 中正确更新索引和 .gitmodules 。

注意:您现在可能可以执行 git mv oldpath newpath ,如 VonC答案。 (确保您使用的是最新版本的git)

I found following workflow working:

  • Update .gitmodules
  • mv oldpath newpath
  • git rm oldpath
  • git add newpath
  • git submodule sync

Note: this approach does not update the index and .gitmodules properly in 2018 versions of GIT.

Note: You may be able to just do git mv oldpath newpath now, as pointed out in VonC's answer. (Ensure you are using the latest version of git)

谁与争疯 2024-10-16 09:56:26

正确的解决方案是:

mv oldpath ~/another-location
git rm oldpath
git submodule add submodule-repository-URL newpath

The correct solution is:

mv oldpath ~/another-location
git rm oldpath
git submodule add submodule-repository-URL newpath
梦纸 2024-10-16 09:56:26

无法重命名它,因此您必须先将其删除 (deinit),然后再次添加。

因此,删除它后:

git submodule deinit <path>
git rm --cached <path>

您还可以仔细检查并删除对它的引用:

  • .gitmodules
  • .git/config
  • .git/modules/ 中删除引用文件夹(最好进行备份),因为每个文件夹都有 config 文件,其中保存对其 worktree 的引用,

然后通过提交来暂存更改通过以下方式对您的存储库进行任何更改:

git commit -am 'Removing submodule.'

并通过以下方式仔细检查您是否没有任何未解决的问题:

git submodule update
git submodule sync
git submodule status

所以现在您可以再次添加 git 子模块:

git submodule add --name <custom_name> [email protected]:foo/bar.git <my/path>

It's not possible to rename it, so you've to remove it first (deinit) and add it again.

So after removing it:

git submodule deinit <path>
git rm --cached <path>

you may also double check and remove the references to it in:

  • .gitmodules
  • .git/config
  • remove reference folder from .git/modules/<name> (best to make a backup), as each folder has config file where it keeps the reference to its worktree

then stage your changes by committing any changes to your repo by:

git commit -am 'Removing submodule.'

and double check if you don't have any outstanding issues by:

git submodule update
git submodule sync
git submodule status

so now you can add the git submodule again:

git submodule add --name <custom_name> [email protected]:foo/bar.git <my/path>
风尘浪孓 2024-10-16 09:56:26

我只是尝试了上面建议的一些。我正在运行:

$ git --version
git version 1.8.4

我发现最好取消初始化子模块,删除目录并创建一个新的子模块。

git submodule deinit <submodule name>

git rm <submodule folder name>

git submodule add <address to remote git repo> <new folder name>

至少这对我来说是最好的。嗯嗯!

I just tried a few of the suggested above. I'm running:

$ git --version
git version 1.8.4

I found it was best to de-init the submodule, remove the directory and create a new submodule.

git submodule deinit <submodule name>

git rm <submodule folder name>

git submodule add <address to remote git repo> <new folder name>

At least that is what worked for me best. YMMV!

幻梦 2024-10-16 09:56:26

MacOs:当我想使用VonC解决方案更改子模块文件夹时Common 改为小写:

git mv Common common

我明白

致命:重命名“Common”失败:参数无效

解决方案 - 使用一些临时文件夹名称并移动两次:

git mv Common commontemp
git mv commontemp common

仅此而已:)

MacOs: When I wanna use VonC solution to change submodule folder Common to lowercase:

git mv Common common

I get

fatal: renaming 'Common' failed: Invalid argument

Solution - use some temporary folder name and move twice:

git mv Common commontemp
git mv commontemp common

That's all :)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文