This really annoyed me, so I came up with a blueprint library helper function, and a blutility to accomplish this.
The code for the function is:
void UTOTGameBPLibrary::ReplaceStaticMeshSockets(class UStaticMesh *Source, class UStaticMesh *Dest)
{
#if WITH_EDITOR
if (Source != nullptr && Dest != nullptr && Source != Dest)
{
if (Source->Sockets.Num() > 0)
{
Dest->PreEditChange(NULL);
Dest->Sockets.Empty();
for (int32 i = 0; i < Source->Sockets.Num(); i++)
{
auto Sock = Source->Sockets[i];
UStaticMeshSocket *NewSocket = NewObject<UStaticMeshSocket>(Dest);
NewSocket->SocketName = Sock->SocketName;
NewSocket->SetFlags(RF_Transactional);
NewSocket->RelativeLocation = Sock->RelativeLocation;
NewSocket->RelativeRotation = Sock->RelativeRotation;
NewSocket->RelativeScale = Sock->RelativeScale;
NewSocket->Tag = Sock->Tag;
Dest->Sockets.Add(NewSocket);
}
Dest->PostEditChange();
Dest->MarkPackageDirty();
}
}
#endif
}
and here is a screenshot of the Blutility: